LyoKCiAgICAgICAgSm9obiBXYWxrZXIncyBGbG9hdGluZyBQb2ludCBCZW5jaG1hcmssIGRlcml2ZWQgZnJvbS4uLgoKCU1hcmluY2hpcCBJbnRlcmFjdGl2ZSBMZW5zIERlc2lnbiBTeXN0ZW0KCgkJCQkgICAgIEpvaG4gV2Fsa2VyICAgRGVjZW1iZXIgMTk4MAoKCUJ5IEpvaG4gV2Fsa2VyCgkgICBodHRwOi8vd3d3LmZvdXJtaWxhYi5jaC8KCglUaGlzICBwcm9ncmFtIG1heSBiZSB1c2VkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIGZyZWVseSBhcwoJbG9uZyBhcyB0aGUgb3JpZ2luIGluZm9ybWF0aW9uIGlzIHByZXNlcnZlZC4KCglUaGlzICBpcyAgYSAgY29tcGxldGUgIG9wdGljYWwJZGVzaWduCXJheXRyYWNpbmcgIGFsZ29yaXRobSwKCXN0cmlwcGVkIG9mIGl0cyB1c2VyIGludGVyZmFjZSBhbmQgcmVjYXN0IGludG8gcG9ydGFibGUgQy4gIEl0Cglub3Qgb25seSBkZXRlcm1pbmVzIGV4ZWN1dGlvbiBzcGVlZCBvbiBhbiAgZXh0cmVtZWx5ICBmbG9hdGluZwoJcG9pbnQJKGluY2x1ZGluZyAgIHRyaWcgICBmdW5jdGlvbikJaW50ZW5zaXZlICAgcmVhbC13b3JsZAoJYXBwbGljYXRpb24sIGl0ICBjaGVja3MgIGFjY3VyYWN5ICBvbiAgYW4gIGFsZ29yaXRobSAgdGhhdCAgaXMKCWV4cXVpc2l0ZWx5ICBzZW5zaXRpdmUJdG8gIGVycm9ycy4gICBUaGUgIHBlcmZvcm1hbmNlIG9mIHRoaXMKCXByb2dyYW0gaXMgdHlwaWNhbGx5IGZhciBtb3JlICBzZW5zaXRpdmUgIHRvICBjaGFuZ2VzICBpbiAgdGhlCgllZmZpY2llbmN5ICBvZgl0aGUgIHRyaWdvbm9tZXRyaWMgIGxpYnJhcnkgIHJvdXRpbmVzIHRoYW4gdGhlCglhdmVyYWdlIGZsb2F0aW5nIHBvaW50IHByb2dyYW0uCgoJVGhlIGJlbmNobWFyayBtYXkgYmUgY29tcGlsZWQgaW4gdHdvICBtb2Rlcy4gICBJZiAgdGhlCXN5bWJvbAoJSU5UUklHCWlzICBkZWZpbmVkLCAgYnVpbHQtaW4JdHJpZ29ub21ldHJpYyAgYW5kIHNxdWFyZSByb290Cglyb3V0aW5lcyB3aWxsIGJlIHVzZWQgZm9yIGFsbCBjYWxjdWxhdGlvbnMuICBUaW1pbmdzIG1hZGUgd2l0aAogICAgICAgIElOVFJJRyAgZGVmaW5lZCAgcmVmbGVjdCAgdGhlICBtYWNoaW5lJ3MgIGJhc2ljIGZsb2F0aW5nIHBvaW50CglwZXJmb3JtYW5jZSBmb3IgdGhlIGFyaXRobWV0aWMgb3BlcmF0b3JzLiAgSWYgIElOVFJJRyAgaXMgIG5vdAoJZGVmaW5lZCwgIHRoZSAgc3lzdGVtICBsaWJyYXJ5CTxtYXRoLmg+ICBmdW5jdGlvbnMgIGFyZSB1c2VkLgogICAgICAgIFJlc3VsdHMgd2l0aCBJTlRSSUcgbm90IGRlZmluZWQgcmVmbGVjdCB0aGUgIHN5c3RlbSdzICBsaWJyYXJ5CglwZXJmb3JtYW5jZSAgYW5kL29yICBmbG9hdGluZyAgcG9pbnQgaGFyZHdhcmUgc3VwcG9ydCBmb3IgdHJpZwoJZnVuY3Rpb25zIGFuZCBzcXVhcmUgcm9vdC4gIFJlc3VsdHMgd2l0aCBJTlRSSUcgZGVmaW5lZCBhcmUgIGEKCWdvb2QgIGd1aWRlICB0byAgZ2VuZXJhbCAgZmxvYXRpbmcgIHBvaW50ICBwZXJmb3JtYW5jZSwgIHdoaWxlCglyZXN1bHRzIHdpdGggSU5UUklHIHVuZGVmaW5lZCBpbmRpY2F0ZSB0aGUgcGVyZm9ybWFuY2UJb2YgIGFuCglhcHBsaWNhdGlvbiB3aGljaCBpcyBtYXRoIGZ1bmN0aW9uIGludGVuc2l2ZS4KCglTcGVjaWFsICBub3RlICByZWdhcmRpbmcgIGVycm9ycyBpbiBhY2N1cmFjeTogdGhpcyBwcm9ncmFtIGhhcwoJZ2VuZXJhdGVkIG51bWJlcnMgaWRlbnRpY2FsIHRvIHRoZSBsYXN0IGRpZ2l0IGl0ICBmb3JtYXRzICBhbmQKCWNoZWNrcyBvbiB0aGUgZm9sbG93aW5nIG1hY2hpbmVzLCBmbG9hdGluZyBwb2ludAoJYXJjaGl0ZWN0dXJlcywgYW5kIGxhbmd1YWdlczoKCglNYXJpbmNoaXAgOTkwMAkgIFFCQVNJQyAgICBJQk0gMzcwIGRvdWJsZS1wcmVjaXNpb24gKFJFQUwgKiA4KSBmb3JtYXQKCglJQk0gUEMgLyBYVCAvIEFUICBMYXR0aWNlIEMgSUVFRSA2NCBiaXQsIDgwIGJpdCB0ZW1wb3JhcmllcwoJCQkgIEhpZ2ggQyAgICBzYW1lLCBpbiBsaW5lIDgweDg3IGNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgICBCQVNJQ0EgICAgIkRvdWJsZSBwcmVjaXNpb24iCgkJCSAgUXVpY2sgQkFTSUMgSUVFRSBkb3VibGUgcHJlY2lzaW9uLCBzb2Z0d2FyZSByb3V0aW5lcwoKCVN1biAzCQkgIEMJICAgIElFRUUgNjQgYml0LCA4MCBiaXQgdGVtcG9yYXJpZXMsCgkJCQkgICAgaW4tbGluZSA2ODg4MSBjb2RlLCBpbi1saW5lIEZQQSBjb2RlLgoKICAgICAgICBNaWNyb1ZBWCBJSSAgICAgICBDICAgICAgICAgVmF4ICJHIiBmb3JtYXQgZmxvYXRpbmcgcG9pbnQKCglNYWNpbnRvc2ggUGx1cwkgIE1QVyBDICAgICBTQU5FIGZsb2F0aW5nIHBvaW50LCBJRUVFIDY0IGJpdCBmb3JtYXQKCQkJCSAgICBpbXBsZW1lbnRlZCBpbiBST00uCgoJSW5hY2N1cmFjaWVzICByZXBvcnRlZAlieSAgdGhpcyAgcHJvZ3JhbSBzaG91bGQgYmUgdGFrZW4gVkVSWQoJU0VSSU9VU0xZIElOREVFRCwgYXMgdGhlIHByb2dyYW0gaGFzIGJlZW4gZGVtb25zdHJhdGVkCXRvICBiZQoJaW52YXJpYW50ICB1bmRlciAgY2hhbmdlcyBpbiBmbG9hdGluZyBwb2ludCBmb3JtYXQsIGFzIGxvbmcgYXMKCXRoZSBmb3JtYXQgaXMgYSByZWNvZ25pc2VkIGRvdWJsZSBwcmVjaXNpb24gIGZvcm1hdC4gICBJZiAgeW91CgllbmNvdW50ZXIgZXJyb3JzLCBwbGVhc2UgcmVtZW1iZXIgdGhhdCB0aGV5IGFyZSBqdXN0IGFzIGxpa2VseQoJdG8gIGJlCWluICB0aGUgIGZsb2F0aW5nICBwb2ludCAgZWRpdGluZyAgIGxpYnJhcnkgICBvciAgIHRoZQoJdHJpZ29ub21ldHJpYyAgbGlicmFyaWVzICBhcyAgaW4gIHRoZSBsb3cgbGV2ZWwgb3BlcmF0b3IgY29kZS4KCglUaGUgYmVuY2htYXJrIGFzc3VtZXMgdGhhdCByZXN1bHRzIGFyZSBiYXNpY2FsbHkgcmVsaWFibGUsIGFuZAoJb25seSB0ZXN0cyB0aGUgbGFzdCByZXN1bHQgY29tcHV0ZWQgYWdhaW5zdCB0aGUgcmVmZXJlbmNlLiAgSWYKICAgICAgICB5b3UncmUgcnVubmluZyBvbiAgYSAgc3VzcGVjdCAgc3lzdGVtICB5b3UgIGNhbiAgY29tcGlsZSAgdGhpcwoJcHJvZ3JhbSAgd2l0aCAgQUNDVVJBQ1kgZGVmaW5lZC4gIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIHZlcnNpb24KCXdoaWNoIGV4ZWN1dGVzIGFzIGFuIGluZmluaXRlIGxvb3AsIHBlcmZvcm1pbmcgdGhlICByYXkgIHRyYWNlCglhbmQgY2hlY2tpbmcgdGhlIHJlc3VsdHMgb24gZXZlcnkgcGFzcy4gIEFsbCBpbmNvcnJlY3QgcmVzdWx0cwoJd2lsbCBiZSByZXBvcnRlZC4KCglSZXByZXNlbnRhdGl2ZQl0aW1pbmdzICBhcmUgIGdpdmVuICBiZWxvdy4gICBBbGwgIGhhdmUgICBiZWVuCglub3JtYWxpc2VkIGFzIGlmIHJ1biBmb3IgMTAwMCBpdGVyYXRpb25zLgoKICBUaW1lIGluIHNlY29uZHMJCSAgIENvbXB1dGVyLCBDb21waWxlciwgYW5kIG5vdGVzCiBOb3JtYWwgICAgICBJTlRSSUcKCiAzNDY2LjAwICAgIDQwMzEuMDAJQ29tbW9kb3JlIDEyOCwgMiBNaHogODUxMCB3aXRoIHNvZnR3YXJlIGZsb2F0aW5nCgkJCXBvaW50LglBYmFjdXMgU29mdHdhcmUvRGF0YS1CZWNrZXIgU3VwZXItQyAxMjgsCgkJCXZlcnNpb24gMy4wMCwgcnVuIGluIGZhc3QgKDIgTWh6KSBtb2RlLiAgTm90ZToKCQkJdGhlIHJlc3VsdHMgZ2VuZXJhdGVkIGJ5IHRoaXMgc3lzdGVtIGRpZmZlcmVkCgkJCWZyb20gdGhlIHJlZmVyZW5jZSByZXN1bHRzIGluIHRoZSA4dGggdG8gMTB0aAoJCQlkZWNpbWFsIHBsYWNlLgoKIDMyOTAuMDAJCUlCTSBQQy9BVCA2IE1oeiwgTWljcm9zb2Z0L0lCTSBCQVNJQ0EgdmVyc2lvbiBBMy4wMC4KICAgICAgICAgICAgICAgICAgICAgICAgUnVuIHdpdGggdGhlICIvZCIgc3dpdGNoLCBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludC4KCiAyMTMxLjUwCQlJQk0gUEMvQVQgNiBNaHosIExhdHRpY2UgQyB2ZXJzaW9uIDIuMTQsIHNtYWxsIG1vZGVsLgoJCQlUaGlzIHZlcnNpb24gb2YgTGF0dGljZSBjb21waWxlcyBzdWJyb3V0aW5lCgkJCWNhbGxzIHdoaWNoIGVpdGhlciBkbyBzb2Z0d2FyZSBmbG9hdGluZyBwb2ludAoJCQlvciB1c2UgdGhlIDgweDg3LiAgVGhlIG1hY2hpbmUgb24gd2hpY2ggSSByYW4KCQkJdGhpcyBoYWQgYW4gODAyODcsIGJ1dCB0aGUgcmVzdWx0cyB3ZXJlIHNvIGJhZAoJCQlJIHdvbmRlciBpZiBpdCB3YXMgYmVpbmcgdXNlZC4KCiAxNTk4LjAwCQlNYWNpbnRvc2ggUGx1cywgTVBXIEMsIFNBTkUgU29mdHdhcmUgZmxvYXRpbmcgcG9pbnQuCgogMTU4Mi4xMwkJTWFyaW5jaGlwIDk5MDAgMiBNaHosIFFCQVNJQyBjb21waWxlciB3aXRoIHNvZnR3YXJlCgkJCWZsb2F0aW5nIHBvaW50LiAgVGhpcyB3YXMgYSBRQkFTSUMgdmVyc2lvbiBvZiB0aGUKCQkJcHJvZ3JhbSB3aGljaCBjb250YWluZWQgdGhlIGlkZW50aWNhbCBhbGdvcml0aG0uCgogIDQwNC4wMAkJSUJNIFBDL0FUIDYgTWh6LCBNaWNyb3NvZnQgUXVpY2tCQVNJQyB2ZXJzaW9uIDIuMC4KCQkJU29mdHdhcmUgZmxvYXRpbmcgcG9pbnQuCgogIDE2NS4xNQkJSUJNIFBDL0FUIDYgTWh6LCBNZXRhd2FyZSBIaWdoIEMgdmVyc2lvbiAxLjMsIHNtYWxsCgkJCW1vZGVsLglUaGlzIHdhcyBjb21waWxlZCB0byBjYWxsIHN1YnJvdXRpbmVzIGZvcgoJCQlmbG9hdGluZyBwb2ludCwgYW5kIHRoZSBtYWNoaW5lIGNvbnRhaW5lZCBhbiA4MDI4NwoJCQl3aGljaCB3YXMgdXNlZCBieSB0aGUgc3Vicm91dGluZXMuCgogIDE0My4yMAkJTWFjaW50b3NoIElJLCBNUFcgQywgU0FORSBjYWxscy4gIEkgd2FzIHVuYWJsZSB0bwoJCQlkZXRlcm1pbmUgd2hldGhlciBTQU5FIHdhcyB1c2luZyB0aGUgNjg4ODEgY2hpcCBvcgoJCQlub3QuCgogIDEyMS44MAkJU3VuIDMvMTYwIDE2IE1oeiwgU3VuIEMuICBDb21waWxlZCB3aXRoIC1mc29mdCBzd2l0Y2gKCQkJd2hpY2ggZXhlY3V0ZXMgZmxvYXRpbmcgcG9pbnQgaW4gc29mdHdhcmUuCgogICA3OC43OCAgICAgMTEwLjExCUlCTSBSVCBQQyAoTW9kZWwgNjE1MCkuICBJQk0gQUlYIDEuMCBDIGNvbXBpbGVyCgkJCXdpdGggLU8gc3dpdGNoLgoKICAgNzUuMiAgICAgIDI1NC4wCU1pY3Jvc29mdCBRdWljayBDIDEuMCwgaW4tbGluZSA4MDg3IGluc3RydWN0aW9ucywKCQkJY29tcGlsZWQgd2l0aCA4MDI4NiBvcHRpbWlzYXRpb24gb24uICAoU3dpdGNoZXMKCQkJd2VyZSAtT2wgLUZQaTg3LUcyIC1BUykuICBTbWFsbCBtZW1vcnkgbW9kZWwuCgogICA2OS41MAkJSUJNIFBDL0FUIDZNaHosIEJvcmxhbmQgVHVyYm8gQkFTSUMgMS4wLiAgQ29tcGlsZWQKICAgICAgICAgICAgICAgICAgICAgICAgaW4gIjgwODcgcmVxdWlyZWQiIG1vZGUgdG8gZ2VuZXJhdGUgaW4tbGluZQoJCQljb2RlIGZvciB0aGUgbWF0aCBjb3Byb2Nlc3Nvci4KCiAgIDY2Ljk2CQlJQk0gUEMvQVQgNk1oeiwgTWljcm9zb2Z0IFF1aWNrQkFTSUMgNC4wLiAgVGhpcwoJCQlyZWxlYXNlIG9mIFF1aWNrQkFTSUMgY29tcGlsZXMgY29kZSBmb3IgdGhlCgkJCTgwMjg3IG1hdGggY29wcm9jZXNzb3IuCgogICA2Ni4zNiAgICAgMjA2LjM1CUlCTSBQQy9BVCA2TWh6LCBNZXRhd2FyZSBIaWdoIEMgdmVyc2lvbiAxLjMsIHNtYWxsCgkJCW1vZGVsLglUaGlzIHdhcyBjb21waWxlZCB3aXRoIGluLWxpbmUgY29kZSBmb3IgdGhlCgkJCTgwMjg3IG1hdGggY29wcm9jZXNzb3IuICBUcmlnIGZ1bmN0aW9ucyBzdGlsbCBjYWxsCgkJCWxpYnJhcnkgcm91dGluZXMuCgogICA2My4wNyAgICAgMjIwLjQzCUlCTSBQQy9BVCwgNk1oeiwgQm9ybGFuZCBUdXJibyBDLCBpbi1saW5lIDgwODcgY29kZSwKCQkJc21hbGwgbW9kZWwsIHdvcmQgYWxpZ25tZW50LCBubyBzdGFjayBjaGVja2luZywKCQkJODA4NiBjb2RlIG1vZGUuCgogICAxNy4xOAkJQXBvbGxvIEROLTMwMDAsIDEyIE1oeiA2ODAyMCB3aXRoIDY4ODgxLCBjb21waWxlZAoJCQl3aXRoIGluLWxpbmUgY29kZSBmb3IgdGhlIDY4ODgxIGNvcHJvY2Vzc29yLgoJCQlBY2NvcmRpbmcgdG8gQXBvbGxvLCB0aGUgbGlicmFyeSByb3V0aW5lcyBhcmUgY2hvc2VuCgkJCWF0IHJ1bnRpbWUgYmFzZWQgb24gY29wcm9jZXNzb3IgcHJlc2VuY2UuICBTaW5jZSB0aGUKCQkJY29wcm9jZXNzb3Igd2FzIHByZXNlbnQsIHRoZSBsaWJyYXJ5IGlzIHN1cHBvc2VkIHRvCgkJCXVzZSBpbi1saW5lIGZsb2F0aW5nIHBvaW50IGNvZGUuCgogICAxNS41NSAgICAgIDI3LjU2CVZBWHN0YXRpb24gSUkgR1BYLiAgQ29tcGlsZWQgYW5kIGV4ZWN1dGVkIHVuZGVyCgkJCVZBWC9WTVMgQy4KCiAgIDE1LjE0ICAgICAgMzcuOTMJTWFjaW50b3NoIElJLCBVbml4IHN5c3RlbSBWLiAgR3JlZW4gSGlsbHMgNjgwMjAKCQkJVW5peCBjb21waWxlciB3aXRoIGluLWxpbmUgY29kZSBmb3IgdGhlIDY4ODgxCgkJCWNvcHJvY2Vzc29yICgtTyAtWkkgc3dpdGNoZXMpLgoKICAgMTIuNjkJCVN1biAzLzE2MCAxNiBNaHosIFN1biBDLiAgQ29tcGlsZWQgd2l0aCAtZnN3aXRjaCwKCQkJd2hpY2ggY2FsbHMgYSBzdWJyb3V0aW5lIHRvIHNlbGVjdCB0aGUgZmFzdGVzdAoJCQlmbG9hdGluZyBwb2ludCBwcm9jZXNzb3IuICBUaGlzIHdhcyB1c2luZyB0aGUgNjg4ODEuCgogICAxMS43NCAgICAgIDI2LjczCUNvbXBhcSBEZXNrcHJvIDM4NiwgMTYgTWh6IDgwMzg2IHdpdGggMTYgTWh6IDgwMzg3LgoJCQlNZXRhd2FyZSBIaWdoIEMgdmVyc2lvbiAxLjMsIGNvbXBpbGVkIHdpdGggaW4tbGluZQoJCQlmb3IgdGhlIG1hdGggY29wcm9jZXNzb3IgKGJ1dCBub3Qgb3B0aW1pc2VkIGZvciB0aGUKCQkJODAzODYvODAzODcpLiAgVHJpZyBmdW5jdGlvbnMgc3RpbGwgY2FsbCBsaWJyYXJ5CgkJCXJvdXRpbmVzLgoKICAgIDguNDMgICAgICAzMC40OQlTdW4gMy8xNjAgMTYgTWh6LCBTdW4gQy4gIENvbXBpbGVkIHdpdGggLWY2ODg4MSwKCQkJZ2VuZXJhdGluZyBpbi1saW5lIE1DNjg4ODEgaW5zdHJ1Y3Rpb25zLiAgVHJpZwoJCQlmdW5jdGlvbnMgc3RpbGwgY2FsbCBsaWJyYXJ5IHJvdXRpbmVzLgoKICAgIDYuMjkgICAgICAyNS4xNwlTdW4gMy8yNjAgMjUgTWh6LCBTdW4gQy4gIENvbXBpbGVkIHdpdGggLWY2ODg4MSwKCQkJZ2VuZXJhdGluZyBpbi1saW5lIE1DNjg4ODEgaW5zdHJ1Y3Rpb25zLiAgVHJpZwoJCQlmdW5jdGlvbnMgc3RpbGwgY2FsbCBsaWJyYXJ5IHJvdXRpbmVzLgoKICAgIDQuNTcJCVN1biAzLzI2MCAyNSBNaHosIFN1biBGT1JUUkFOIDc3LiAgQ29tcGlsZWQgd2l0aAoJCQktTyAtZjY4ODgxLCBnZW5lcmF0aW5nIGluLWxpbmUgTUM2ODg4MSBpbnN0cnVjdGlvbnMuCgkJCVRyaWcgZnVuY3Rpb25zIGFyZSBjb21waWxlZCBpbi1saW5lLiAgVGhpcyB1c2VkCgkJCXRoZSBGT1JUUkFOIDc3IHZlcnNpb24gb2YgdGhlIHByb2dyYW0sIEZCRk9SVDc3LkYuCgogICAgNC4wMCAgICAgIDE0LjIwCVN1bjM4NmkvMjUgTWh6IG1vZGVsIDI1MCwgU3VuIEMgY29tcGlsZXIuCgogICAgNC4wMCAgICAgIDE0LjAwCVN1bjM4NmkvMjUgTWh6IG1vZGVsIDI1MCwgTWV0YXdhcmUgQy4KCiAgICAzLjEwICAgICAgMTIuMDAJQ29tcGFxIDM4Ni8zODcgMjUgTWh6IHJ1bm5pbmcgU0NPIFhlbml4IDIuCgkJCUNvbXBpbGVkIHdpdGggTWV0YXdhcmUgSGlnaEMgMzg2LCBvcHRpbWl6ZWQKCQkJZm9yIDM4Ni4KCiAgICAzLjAwICAgICAgMTIuMDAJQ29tcGFxIDM4Ni8zODcgMjVNSFogb3B0aW1pemVkIGZvciAzODYvMzg3LgoKICAgIDIuOTYgICAgICAgNS4xNwlTdW4gNC8yNjAsIFNwYXJjIFJJU0MgcHJvY2Vzc29yLiAgU3VuIEMsCgkJCWNvbXBpbGVkIHdpdGggdGhlIC1PMiBzd2l0Y2ggZm9yIGdsb2JhbAoJCQlvcHRpbWlzYXRpb24uCgogICAgMi40NwkJQ09NUEFRIDQ4Ni8yNSwgc2Vjb25kYXJ5IGNhY2hlIGRpc2FibGVkLCBIaWdoIEMsCgkJCTQ4Ni8zODcsIGlubGluZSBmLnAuLCBzbWFsbCBtZW1vcnkgbW9kZWwuCgogICAgMi4yMCAgICAgICAzLjQwCURhdGEgR2VuZXJhbCBNb3Rvcm9sYSA4ODAwMCwgMTYgTWh6LCBHbnUgQy4KCiAgICAxLjU2CQlDT01QQVEgNDg2LzI1LCAxMjhLIHNlY29uZGFyeSBjYWNoZSwgSGlnaCBDLCA0ODYvMzg3LAoJCQlpbmxpbmUgZi5wLiwgc21hbGwgbWVtb3J5IG1vZGVsLgoKICAgIDAuNjYgICAgICAgMS41MAlERUMgUG1heCwgTWlwcyBwcm9jZXNzb3IuCgogICAgMC42MyAgICAgICAwLjkxCVN1biBTcGFyY1N0YXRpb24gMiwgU3VuIEMgKFN1bk9TIDQuMS4xKSB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgIC1PNCBvcHRpbWlzYXRpb24gYW5kICIvdXNyL2xpYi9saWJtLmlsIiBpbmxpbmUKCQkJZmxvYXRpbmcgcG9pbnQuCgogICAgMC42MCAgICAgICAxLjA3CUludGVsIDg2MCBSSVNDIHByb2Nlc3NvciwgMzMgTWh6LCBHcmVlbmhpbGxzCgkJCUMgY29tcGlsZXIuCgogICAgMC40MCAgICAgICAwLjkwCURlYyAzTUFYLCBNSVBTIDMwMDAgcHJvY2Vzc29yLCAtTzQuCgogICAgMC4zMSAgICAgICAwLjkwCUlCTSBSUy82MDAwLCAtTy4KCiAgICAwLjExMjkgICAgIDAuMjExOQlEZWxsIERpbWVuc2lvbiBYUFMgUDEzM2MsIFBlbnRpdW0gMTMzIE1IeiwKCQkJV2luZG93cyA5NSwgTWljcm9zb2Z0IFZpc3VhbCBDIDUuMC4KCiAgICAwLjA4ODMgICAgIDAuMjE2NglTaWxpY29uIEdyYXBoaWNzIEluZGlnb7IsIE1JUFMgUjQ0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDE3NSBNaHosICItTzMiLgoKICAgIDAuMDM1MSAgICAgMC4wNTYxCURlbGwgRGltZW5zaW9uIFhQUyBSMTAwLCBQZW50aXVtIElJIDQwMCBNSHosCgkJCVdpbmRvd3MgOTgsIE1pY3Jvc29mdCBWaXN1YWwgQyA1LjAuCgogICAgMC4wMzEyICAgICAwLjA1NDIJU3VuIFVsdHJhIDIsIFVsdHJhU1BBUkMgVjksIDMwMCBNSHosIFNvbGFyaXMKCQkJMi41LjEuCgkJCQogICAgMC4wMDg2MiAgICAwLjAxMDc0ICBEZWxsIEluc3Bpcm9uIDkxMDAsIFBlbnRpdW0gNCwgMy40IEdIeiwgZ2NjIC1PMy4KCiovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpZm5kZWYgSU5UUklHCiNpbmNsdWRlIDxtYXRoLmg+CiNlbmRpZgoKI2RlZmluZSBjb3QoeCkgKDEuMCAvIHRhbih4KSkKCiNkZWZpbmUgVFJVRSAgMQojZGVmaW5lIEZBTFNFIDAKCiNkZWZpbmUgbWF4X3N1cmZhY2VzIDEwCgovKiAgTG9jYWwgdmFyaWFibGVzICAqLwoKc3RhdGljIGNoYXIgdGJmclsxMzJdOwoKc3RhdGljIHNob3J0IGN1cnJlbnRfc3VyZmFjZXM7CnN0YXRpYyBzaG9ydCBwYXJheGlhbDsKCnN0YXRpYyBkb3VibGUgY2xlYXJfYXBlcnR1cmU7CgpzdGF0aWMgZG91YmxlIGFiZXJyX2xzcGhlcjsKc3RhdGljIGRvdWJsZSBhYmVycl9vc2M7CnN0YXRpYyBkb3VibGUgYWJlcnJfbGNocm9tOwoKc3RhdGljIGRvdWJsZSBtYXhfbHNwaGVyOwpzdGF0aWMgZG91YmxlIG1heF9vc2M7CnN0YXRpYyBkb3VibGUgbWF4X2xjaHJvbTsKCnN0YXRpYyBkb3VibGUgcmFkaXVzX29mX2N1cnZhdHVyZTsKc3RhdGljIGRvdWJsZSBvYmplY3RfZGlzdGFuY2U7CnN0YXRpYyBkb3VibGUgcmF5X2hlaWdodDsKc3RhdGljIGRvdWJsZSBheGlzX3Nsb3BlX2FuZ2xlOwpzdGF0aWMgZG91YmxlIGZyb21faW5kZXg7CnN0YXRpYyBkb3VibGUgdG9faW5kZXg7CgpzdGF0aWMgZG91YmxlIHNwZWN0cmFsX2xpbmVbOV07CnN0YXRpYyBkb3VibGUgc1ttYXhfc3VyZmFjZXNdWzVdOwpzdGF0aWMgZG91YmxlIG9kX3NhWzJdWzJdOwoKc3RhdGljIGNoYXIgb3V0YXJyWzhdWzgwXTsJICAgLyogQ29tcHV0ZWQgb3V0cHV0IG9mIHByb2dyYW0gZ29lcyBoZXJlICovCgppbnQgaXRlcmNvdW50OwkJCSAgIC8qIFRoZSBpdGVyYXRpb24gY291bnRlciBmb3IgdGhlIG1haW4gbG9vcAoJCQkJICAgICAgaW4gdGhlIHByb2dyYW0gaXMgbWFkZSBnbG9iYWwgc28gdGhhdAoJCQkJICAgICAgdGhlIGNvbXBpbGVyIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0bwoJCQkJICAgICAgb3B0aW1pc2Ugb3V0IHRoZSBsb29wIG92ZXIgdGhlIHJheQoJCQkJICAgICAgdHJhY2luZyBjb2RlLiAqLwoKI2lmbmRlZiBJVEVSQVRJT05TCiNkZWZpbmUgSVRFUkFUSU9OUyAxMDAwCiNlbmRpZgppbnQgbml0ZXIgPSBJVEVSQVRJT05TOyAJICAgLyogSXRlcmF0aW9uIGNvdW50ZXIgKi8KCnN0YXRpYyBjaGFyICpyZWZhcnJbXSA9IHsJICAgLyogUmVmZXJlbmNlIHJlc3VsdHMuICBUaGVzZSBoYXBwZW4gdG8KCQkJCSAgICAgIGJlIGRlcml2ZWQgZnJvbSBhIHJ1biBvbiBNaWNyb3NvZnQgCgkJCQkgICAgICBRdWljayBCQVNJQyBvbiB0aGUgSUJNIFBDL0FULiAqLwoKICAgICAgICAiICAgTWFyZ2luYWwgcmF5ICAgICAgICAgIDQ3LjA5NDc5MTIwOTIwICAgMC4wNDE3ODQ3MjY4MyIsCiAgICAgICAgIiAgIFBhcmF4aWFsIHJheSAgICAgICAgICA0Ny4wODM3MjE2MDI0OSAgIDAuMDQxNzc4NjQ4MjEiLAogICAgICAgICJMb25naXR1ZGluYWwgc3BoZXJpY2FsIGFiZXJyYXRpb246ICAgICAgICAtMC4wMTEwNjk2MDY3MSIsCiAgICAgICAgIiAgICAoTWF4aW11bSBwZXJtaXNzaWJsZSk6ICAgICAgICAgICAgICAgICAwLjA1MzA2NzQ5OTA3IiwKICAgICAgICAiT2ZmZW5zZSBhZ2FpbnN0IHNpbmUgY29uZGl0aW9uIChjb21hKTogICAgIDAuMDAwMDg5NTQ3NjEiLAogICAgICAgICIgICAgKE1heGltdW0gcGVybWlzc2libGUpOiAgICAgICAgICAgICAgICAgMC4wMDI1MDAwMDAwMCIsCiAgICAgICAgIkF4aWFsIGNocm9tYXRpYyBhYmVycmF0aW9uOiAgICAgICAgICAgICAgICAwLjAwNDQ4MjI5MDMyIiwKICAgICAgICAiICAgIChNYXhpbXVtIHBlcm1pc3NpYmxlKTogICAgICAgICAgICAgICAgIDAuMDUzMDY3NDk5MDciCn07CgovKiBUaGUJdGVzdCAgY2FzZSAgdXNlZCAgaW4gIHRoaXMgcHJvZ3JhbSBpcyB0aGUgIGRlc2lnbiBmb3IgYSA0IGluY2gKICAgYWNocm9tYXRpYyB0ZWxlc2NvcGUgIG9iamVjdGl2ZSAgdXNlZCAgYXMgIHRoZSAgZXhhbXBsZSAgaW4gIFd5bGQncwogICBjbGFzc2ljICB3b3JrICBvbiAgcmF5ICB0cmFjaW5nIGJ5IGhhbmQsIGdpdmVuIGluIEFtYXRldXIgVGVsZXNjb3BlCiAgIE1ha2luZywgVm9sdW1lIDMuICAqLwoKc3RhdGljIGRvdWJsZSB0ZXN0Y2FzZVs0XVs0XSA9IHsKCXsyNy4wNSwgMS41MTM3LCA2My42LCAwLjUyfSwKCXstMTYuNjgsIDEsIDAsIDAuMTM4fSwKCXstMTYuNjgsIDEuNjE2NCwgMzYuNywgMC4zOH0sCgl7LTc4LjEsIDEsIDAsIDB9Cn07CgovKiAgSW50ZXJuYWwgdHJpZyBmdW5jdGlvbnMgKHVzZWQgb25seSBpZiBJTlRSSUcgaXMgIGRlZmluZWQpLgkgVGhlc2UKICAgIHN0YW5kYXJkICBmdW5jdGlvbnMgIG1heSBiZSBlbmFibGVkIHRvIG9idGFpbiB0aW1pbmdzIHRoYXQgcmVmbGVjdAogICAgdGhlIG1hY2hpbmUncyBmbG9hdGluZyBwb2ludCBwZXJmb3JtYW5jZSByYXRoZXIgdGhhbiB0aGUgc3BlZWQgIG9mCiAgICBpdHMgdHJpZyBmdW5jdGlvbiBldmFsdWF0aW9uLiAgKi8KCiNpZmRlZiBJTlRSSUcKCi8qICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHNob3VsZCBrZWVwIHlvdSBmcm9tIGdldHRpbmcgaW50cm8gdHJvdWJsZQogICAgd2l0aCBjb21waWxlcnMgd2hpY2ggZG9uJ3QgbGV0IHlvdSByZWRlZmluZSBpbnRyaW5zaWMgZnVuY3Rpb25zLiAgKi8KCiNkZWZpbmUgc2luIElfc2luCiNkZWZpbmUgY29zIElfY29zCiNkZWZpbmUgdGFuIElfdGFuCiNkZWZpbmUgc3FydCBJX3NxcnQKI2RlZmluZSBhdGFuIElfYXRhbgojZGVmaW5lIGF0YW4yIElfYXRhbjIKI2RlZmluZSBhc2luIElfYXNpbgoKI2RlZmluZSBmYWJzKHgpICAoKHggPCAwLjApID8gLXggOiB4KQoKI2RlZmluZSBwaWMgMy4xNDE1OTI2NTM1ODk3OTMyCgovKiAgQ29tbW9ubHkgdXNlZCBjb25zdGFudHMgICovCgpzdGF0aWMgZG91YmxlIHBpID0gcGljLAoJdHdvcGkgPXBpYyAqIDIuMCwKCXBpb3ZlcjQgPSBwaWMgLyA0LjAsCglmb3Vyb3ZlcnBpID0gNC4wIC8gcGljLAoJcGlvdmVyMiA9IHBpYyAvIDIuMDsKCi8qICBDb2VmZmljaWVudHMgZm9yIEFUQU4gZXZhbHVhdGlvbiAgKi8KCnN0YXRpYyBkb3VibGUgYXRhbmNbXSA9IHsKCTAuMCwKCTAuNDYzNjQ3NjA5MDAwODA2MTE2NSwKCTAuNzg1Mzk4MTYzMzk3NDQ4MzA5NCwKCTAuOTgyNzkzNzIzMjQ3MzI5MDY3MTQsCgkxLjEwNzE0ODcxNzc5NDA5MDUwMjIsCgkxLjE5MDI4OTk0OTY4MjUzMTczMjIsCgkxLjI0OTA0NTc3MjM5ODI1NDQyNjIsCgkxLjI5MjQ5NjY2Nzc4OTc4NTI2NzMsCgkxLjMyNTgxNzY2MzY2ODAzMjQ2NDQKfTsKCi8qICBhaW50KHgpCSAgUmV0dXJuIGludGVnZXIgcGFydCBvZiBudW1iZXIuICBUcnVuY2F0ZXMgdG93YXJkcyAwCSAqLwoKZG91YmxlIGFpbnQoeCkKZG91YmxlIHg7CnsKCWxvbmcgbDsKCgkvKiAgTm90ZSB0aGF0IHRoaXMgcm91dGluZSBjYW5ub3QgaGFuZGxlIHRoZSBmdWxsIGZsb2F0aW5nIHBvaW50CgkgICAgbnVtYmVyIHJhbmdlLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW4gdGhlIG1hY2hpbmUtZGVwZW5kZW50CgkgICAgZmxvYXRpbmcgcG9pbnQgbGlicmFyeSEgICovCgoJbCA9IHg7CglpZiAoKGludCkoLTAuNSkgIT0gMCAgJiYgIGwgPCAwICkKCSAgIGwrKzsKCXggPSBsOwoJcmV0dXJuIHg7Cn0KCi8qICBzaW4oeCkJICBSZXR1cm4gc2luZSwgeCBpbiByYWRpYW5zICAqLwoKc3RhdGljIGRvdWJsZSBzaW4oeCkKZG91YmxlIHg7CnsKCWludCBzaWduOwoJZG91YmxlIHksIHIsIHo7CgoJeCA9ICgoKHNpZ249ICh4IDwgMC4wKSkgIT0gMCkgPyAteDogeCk7CgoJaWYgKHggPiB0d29waSkKCSAgIHggLT0gKGFpbnQoeCAvIHR3b3BpKSAqIHR3b3BpKTsKCglpZiAoeCA+IHBpKSB7CgkgICB4IC09IHBpOwoJICAgc2lnbiA9ICFzaWduOwoJfQoKCWlmICh4ID4gcGlvdmVyMikKCSAgIHggPSBwaSAtIHg7CgoJaWYgKHggPCBwaW92ZXI0KSB7CgkgICB5ID0geCAqIGZvdXJvdmVycGk7CgkgICB6ID0geSAqIHk7CgkgICByID0geSAqICgoKCgoKCgtMC4yMDIyNTMxMjkyOTNFLTEzICogeiArIDAuNjk0ODE1MjAzNTA1MjJFLTExKSAqIHogLQoJICAgICAgMC4xNzU3MjQ3NDE3NjE3MDgwNkUtOCkgKiB6ICsgMC4zMTMzNjE2ODg5MTczMjUzNDhFLTYpICogeiAtCgkgICAgICAwLjM2NTc2MjA0MTgyMTQ2NDAwMUUtNCkgKiB6ICsgMC4yNDkwMzk0NTcwMTkyNzE2MjhFLTIpICogeiAtCgkgICAgICAwLjA4MDc0NTUxMjE4ODI4MDc4MTUpICogeiArIDAuNzg1Mzk4MTYzMzk3NDQ4MzEwKTsKCX0gZWxzZSB7CgkgICB5ID0gKHBpb3ZlcjIgLSB4KSAqIGZvdXJvdmVycGk7CgkgICB6ID0geSAqIHk7CgkgICByID0gKCgoKCgoLTAuMzg1Nzc2MjAzNzJFLTEyICogeiArIDAuMTE1MDA0OTcwMjQyNjNFLTkpICogeiAtCgkgICAgICAwLjI0NjExMzYzODI2MzcwMDVFLTcpICogeiArIDAuMzU5MDg2MDQ0NTg4NTgxOTUzRS01KSAqIHogLQoJICAgICAgMC4zMjU5OTE4ODY5MjY2ODc1NTBFLTMpICogeiArIDAuMDE1ODU0MzQ0MjQzODE1NDEwOSkgKiB6IC0KCSAgICAgIDAuMzA4NDI1MTM3NTM0MDQyNDUyKSAqIHogKyAxLjA7Cgl9CglyZXR1cm4gc2lnbiA/IC1yIDogcjsKfQoKLyogIGNvcyh4KQkgIFJldHVybiBjb3NpbmUsIHggaW4gcmFkaWFucywgYnkgaWRlbnRpdHkgICovCgpzdGF0aWMgZG91YmxlIGNvcyh4KQpkb3VibGUgeDsKewoJeCA9ICh4IDwgMC4wKSA/IC14IDogeDsKCWlmICh4ID4gdHdvcGkpCQkgICAgICAvKiBEbyByYW5nZSByZWR1Y3Rpb24gaGVyZSB0byBsaW1pdCAqLwoJICAgeCA9IHggLSAoYWludCh4IC8gdHdvcGkpICogdHdvcGkpOyAvKiByb3VuZG9mZiBvbiBhZGQgb2YgUEkvMiAgICAqLwoJcmV0dXJuIHNpbih4ICsgcGlvdmVyMik7Cn0KCi8qICB0YW4oeCkJICBSZXR1cm4gdGFuZ2VudCwgeCBpbiByYWRpYW5zLCBieSBpZGVudGl0eSAgKi8KCnN0YXRpYyBkb3VibGUgdGFuKHgpCmRvdWJsZSB4Owp7CglyZXR1cm4gc2luKHgpIC8gY29zKHgpOwp9CgovKiAgc3FydCh4KQkgIFJldHVybiBzcXVhcmUgcm9vdC4gIEluaXRpYWwgZ3Vlc3MsIHRoZW4gTmV3dG9uLQoJCSAgUmFwaHNvbiByZWZpbmVtZW50ICAqLwoKZG91YmxlIHNxcnQoeCkKZG91YmxlIHg7CnsKCWRvdWJsZSBjLCBjbCwgeTsKCWludCBuOwoKCWlmICh4ID09IDAuMCkKCSAgIHJldHVybiAwLjA7CgoJaWYgKHggPCAwLjApIHsKCSAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICJcbkdvb2Qgd29yayEgIFlvdSB0cmllZCB0byB0YWtlIHRoZSBzcXVhcmUgcm9vdCBvZiAlZyIsCgkgICAgIHgpOwoJICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgIlxudW5mb3J0dW5hdGVseSwgdGhhdCBpcyB0b28gY29tcGxleCBmb3IgbWUgdG8gaGFuZGxlLlxuIik7CgkgICBleGl0KDEpOwoJfQoKCXkgPSAoMC4xNTQxMTYgKyAxLjg5Mzg3MiAqIHgpIC8gKDEuMCArIDEuMDQ3OTg4ICogeCk7CgoJYyA9ICh5IC0geCAvIHkpIC8gMi4wOwoJY2wgPSAwLjA7Cglmb3IgKG4gPSA1MDsgYyAhPSBjbCAmJiBuLS07KSB7CgkgICB5ID0geSAtIGM7CgkgICBjbCA9IGM7CgkgICBjID0gKHkgLSB4IC8geSkgLyAyLjA7Cgl9CglyZXR1cm4geTsKfQoKLyogIGF0YW4oeCkJICBSZXR1cm4gYXJjdGFuZ2VudCBpbiByYWRpYW5zLAoJCSAgcmFuZ2UgLXBpLzIgdG8gcGkvMiAgKi8KCnN0YXRpYyBkb3VibGUgYXRhbih4KQpkb3VibGUgeDsKewoJaW50IHNpZ24sIGwsIHk7Cglkb3VibGUgYSwgYiwgejsKCgl4ID0gKCgoc2lnbiA9ICh4IDwgMC4wKSkgIT0gMCkgPyAteCA6IHgpOwoJbCA9IDA7CgoJaWYgKHggPj0gNC4wKSB7CgkgICBsID0gLTE7CgkgICB4ID0gMS4wIC8geDsKCSAgIHkgPSAwOwoJICAgZ290byBhdGw7Cgl9IGVsc2UgewoJICAgaWYgKHggPCAwLjI1KSB7CgkgICAgICB5ID0gMDsKCSAgICAgIGdvdG8gYXRsOwoJICAgfQoJfQoKCXkgPSBhaW50KHggLyAwLjUpOwoJeiA9IHkgKiAwLjU7Cgl4ID0gKHggLSB6KSAvICh4ICogeiArIDEpOwoKYXRsOgoJeiA9IHggKiB4OwoJYiA9ICgoKCg4OTMwMjUuMCAqIHogKyA0OTExNjM3NS4wKSAqIHogKyA0MjU2NzUyNTAuMCkgKiB6ICsKCSAgICAxMjc3MDI1NzUwLjApICogeiArIDE1NTA2NzQxMjUuMCkgKiB6ICsgNjU0NzI5MDc1LjA7CglhID0gKCgoMTM4NTI1NzUuMCAqIHogKyAyMTY2MDIxMDAuMCkgKiB6ICsgODkxMDgwMTkwLjApICogeiArCgkgICAgMTMzMjQzMTEwMC4wKSAqIHogKyA2NTQ3MjkwNzUuMDsKCWEgPSAoYSAvIGIpICogeCArIGF0YW5jW3ldOwoJaWYgKGwpCgkgICBhPXBpb3ZlcjIgLSBhOwoJcmV0dXJuIHNpZ24gPyAtYSA6IGE7Cn0KCi8qICBhdGFuMih5LHgpCSAgUmV0dXJuIGFyY3RhbmdlbnQgaW4gcmFkaWFucyBvZiB5L3gsCgkJICByYW5nZSAtcGkgdG8gcGkgICovCgpzdGF0aWMgZG91YmxlIGF0YW4yKHksIHgpCmRvdWJsZSB5LCB4Owp7Cglkb3VibGUgdGVtcDsKCglpZiAoeCA9PSAwLjApIHsKCSAgIGlmICh5ID09IDAuMCkgICAvKiAgU3BlY2lhbCBjYXNlOiBhdGFuMigwLDApID0gMCAgKi8KCSAgICAgIHJldHVybiAwLjA7CgkgICBlbHNlIGlmICh5ID4gMCkKCSAgICAgIHJldHVybiBwaW92ZXIyOwoJICAgZWxzZQoJICAgICAgcmV0dXJuIC1waW92ZXIyOwoJfQoJdGVtcCA9IGF0YW4oeSAvIHgpOwoJaWYgKHggPCAwLjApIHsKCSAgIGlmICh5ID49IDAuMCkKCSAgICAgIHRlbXAgKz0gcGljOwoJICAgZWxzZQoJICAgICAgdGVtcCAtPSBwaWM7Cgl9CglyZXR1cm4gdGVtcDsKfQoKLyogIGFzaW4oeCkJICBSZXR1cm4gYXJjc2luZSBpbiByYWRpYW5zIG9mIHggICovCgpzdGF0aWMgZG91YmxlIGFzaW4oeCkKZG91YmxlIHg7CnsKCWlmIChmYWJzKHgpPjEuMCkgewoJICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgIlxuSW52ZXJzZSB0cmlnIGZ1bmN0aW9ucyBsb3NlIG11Y2ggb2YgdGhlaXIgZ2xvc3Mgd2hlbiIpOwoJICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgIlxudGhlaXIgYXJndW1lbnRzIGFyZSBncmVhdGVyIHRoYW4gMSwgc3VjaCBhcyB0aGUiKTsKCSAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICJcbnZhbHVlICVnIHlvdSBwYXNzZWQuXG4iLCB4KTsKCSAgIGV4aXQoMSk7Cgl9CglyZXR1cm4gYXRhbjIoeCwgc3FydCgxIC0geCAqIHgpKTsKfQojZW5kaWYKCi8qCSAgICAgIENhbGN1bGF0ZSBwYXNzYWdlIHRocm91Z2ggc3VyZmFjZQoKCSAgICAgIElmICB0aGUgdmFyaWFibGUgUEFSQVhJQUwgaXMgdHJ1ZSwgdGhlIHRyYWNlIHRocm91Z2ggdGhlCgkgICAgICBzdXJmYWNlIHdpbGwgYmUgZG9uZSB1c2luZyB0aGUgcGFyYXhpYWwgIGFwcHJveGltYXRpb25zLgoJICAgICAgT3RoZXJ3aXNlLCAgdGhlIG5vcm1hbCB0cmlnb25vbWV0cmljIHRyYWNlIHdpbGwgYmUgZG9uZS4KCgkgICAgICBUaGlzIHJvdXRpbmUgdGFrZXMgdGhlIGZvbGxvd2luZyBpbnB1dHM6CgoJICAgICAgUkFESVVTX09GX0NVUlZBVFVSRQkgIFJhZGl1cyBvZiBjdXJ2YXR1cmUgb2Ygc3VyZmFjZQoJCQkJCSAgYmVpbmcgY3Jvc3NlZC4gIElmIDAsIHN1cmZhY2UgaXMKCQkJCQkgIHBsYW5lLgoKCSAgICAgIE9CSkVDVF9ESVNUQU5DRQkJICBEaXN0YW5jZSBvZiBvYmplY3QgZm9jdXMgZnJvbQoJCQkJCSAgbGVucyB2ZXJ0ZXguCUlmIDAsIGluY29taW5nCgkJCQkJICByYXlzIGFyZSBwYXJhbGxlbCBhbmQKCQkJCQkgIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSBzcGVjaWZpZWQ6CgoJICAgICAgUkFZX0hFSUdIVAkJICBIZWlnaHQgb2YgcmF5IGZyb20gYXhpcy4gIE9ubHkKCQkJCQkgIHJlbGV2YW50IGlmIE9CSkVDVC5ESVNUQU5DRSA9PSAwCgoJICAgICAgQVhJU19TTE9QRV9BTkdMRQkJICBBbmdsZSBpbmNvbWluZyByYXkgbWFrZXMgd2l0aCBheGlzCgkJCQkJICBhdCBpbnRlcmNlcHQKCgkgICAgICBGUk9NX0lOREVYCQkgIFJlZnJhY3RpdmUgaW5kZXggb2YgbWVkaXVtIGJlaW5nIGxlZnQKCgkgICAgICBUT19JTkRFWAkJCSAgUmVmcmFjdGl2ZSBpbmRleCBvZiBtZWRpdW0gYmVpbmcKCQkJCQkgIGVudGVyZWQuCgoJICAgICAgVGhlIG91dHB1dHMgYXJlIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgoKCSAgICAgIE9CSkVDVF9ESVNUQU5DRQkJICBEaXN0YW5jZSBmcm9tIHZlcnRleCB0byBvYmplY3QgZm9jdXMKCQkJCQkgIGFmdGVyIHJlZnJhY3Rpb24uCgoJICAgICAgQVhJU19TTE9QRV9BTkdMRQkJICBBbmdsZSBpbmNvbWluZyByYXkgbWFrZXMgd2l0aCBheGlzCgkJCQkJICBhdCBpbnRlcmNlcHQgYWZ0ZXIgcmVmcmFjdGlvbi4KCiovCgpzdGF0aWMgdm9pZCB0cmFuc2l0X3N1cmZhY2UoKSB7Cglkb3VibGUgaWFuZywJCSAgIC8qIEluY2lkZW5jZSBhbmdsZSAqLwoJICAgICAgIHJhbmcsCQkgICAvKiBSZWZyYWN0aW9uIGFuZ2xlICovCgkgICAgICAgaWFuZ19zaW4sCSAgIC8qIEluY2lkZW5jZSBhbmdsZSBzaW4gKi8KCSAgICAgICByYW5nX3NpbiwJICAgLyogUmVmcmFjdGlvbiBhbmdsZSBzaW4gKi8KCSAgICAgICBvbGRfYXhpc19zbG9wZV9hbmdsZSwgc2FnaXR0YTsKCglpZiAocGFyYXhpYWwpIHsKCSAgIGlmIChyYWRpdXNfb2ZfY3VydmF0dXJlICE9IDAuMCkgewoJICAgICAgaWYgKG9iamVjdF9kaXN0YW5jZSA9PSAwLjApIHsKCQkgYXhpc19zbG9wZV9hbmdsZSA9IDAuMDsKCQkgaWFuZ19zaW4gPSByYXlfaGVpZ2h0IC8gcmFkaXVzX29mX2N1cnZhdHVyZTsKCSAgICAgIH0gZWxzZQoJCSBpYW5nX3NpbiA9ICgob2JqZWN0X2Rpc3RhbmNlIC0KCQkgICAgcmFkaXVzX29mX2N1cnZhdHVyZSkgLyByYWRpdXNfb2ZfY3VydmF0dXJlKSAqCgkJICAgIGF4aXNfc2xvcGVfYW5nbGU7CgoJICAgICAgcmFuZ19zaW4gPSAoZnJvbV9pbmRleCAvIHRvX2luZGV4KSAqCgkJIGlhbmdfc2luOwoJICAgICAgb2xkX2F4aXNfc2xvcGVfYW5nbGUgPSBheGlzX3Nsb3BlX2FuZ2xlOwoJICAgICAgYXhpc19zbG9wZV9hbmdsZSA9IGF4aXNfc2xvcGVfYW5nbGUgKwoJCSBpYW5nX3NpbiAtIHJhbmdfc2luOwoJICAgICAgaWYgKG9iamVjdF9kaXN0YW5jZSAhPSAwLjApCgkJIHJheV9oZWlnaHQgPSBvYmplY3RfZGlzdGFuY2UgKiBvbGRfYXhpc19zbG9wZV9hbmdsZTsKCSAgICAgIG9iamVjdF9kaXN0YW5jZSA9IHJheV9oZWlnaHQgLyBheGlzX3Nsb3BlX2FuZ2xlOwoJICAgICAgcmV0dXJuOwoJICAgfQoJICAgb2JqZWN0X2Rpc3RhbmNlID0gb2JqZWN0X2Rpc3RhbmNlICogKHRvX2luZGV4IC8gZnJvbV9pbmRleCk7CgkgICBheGlzX3Nsb3BlX2FuZ2xlID0gYXhpc19zbG9wZV9hbmdsZSAqIChmcm9tX2luZGV4IC8gdG9faW5kZXgpOwoJICAgcmV0dXJuOwoJfQoKCWlmIChyYWRpdXNfb2ZfY3VydmF0dXJlICE9IDAuMCkgewoJICAgaWYgKG9iamVjdF9kaXN0YW5jZSA9PSAwLjApIHsKCSAgICAgIGF4aXNfc2xvcGVfYW5nbGUgPSAwLjA7CgkgICAgICBpYW5nX3NpbiA9IHJheV9oZWlnaHQgLyByYWRpdXNfb2ZfY3VydmF0dXJlOwoJICAgfSBlbHNlIHsKCSAgICAgIGlhbmdfc2luID0gKChvYmplY3RfZGlzdGFuY2UgLQoJCSByYWRpdXNfb2ZfY3VydmF0dXJlKSAvIHJhZGl1c19vZl9jdXJ2YXR1cmUpICoKCQkgc2luKGF4aXNfc2xvcGVfYW5nbGUpOwoJICAgfQoJICAgaWFuZyA9IGFzaW4oaWFuZ19zaW4pOwoJICAgcmFuZ19zaW4gPSAoZnJvbV9pbmRleCAvIHRvX2luZGV4KSAqCgkgICAgICBpYW5nX3NpbjsKCSAgIG9sZF9heGlzX3Nsb3BlX2FuZ2xlID0gYXhpc19zbG9wZV9hbmdsZTsKCSAgIGF4aXNfc2xvcGVfYW5nbGUgPSBheGlzX3Nsb3BlX2FuZ2xlICsKCSAgICAgIGlhbmcgLSBhc2luKHJhbmdfc2luKTsKCSAgIHNhZ2l0dGEgPSBzaW4oKG9sZF9heGlzX3Nsb3BlX2FuZ2xlICsgaWFuZykgLyAyLjApOwoJICAgc2FnaXR0YSA9IDIuMCAqIHJhZGl1c19vZl9jdXJ2YXR1cmUqc2FnaXR0YSpzYWdpdHRhOwoJICAgb2JqZWN0X2Rpc3RhbmNlID0gKChyYWRpdXNfb2ZfY3VydmF0dXJlICogc2luKAoJICAgICAgb2xkX2F4aXNfc2xvcGVfYW5nbGUgKyBpYW5nKSkgKgoJICAgICAgY290KGF4aXNfc2xvcGVfYW5nbGUpKSArIHNhZ2l0dGE7CgkgICByZXR1cm47Cgl9CgoJcmFuZyA9IC1hc2luKChmcm9tX2luZGV4IC8gdG9faW5kZXgpICoKCSAgIHNpbihheGlzX3Nsb3BlX2FuZ2xlKSk7CglvYmplY3RfZGlzdGFuY2UgPSBvYmplY3RfZGlzdGFuY2UgKiAoKHRvX2luZGV4ICoKCSAgIGNvcygtcmFuZykpIC8gKGZyb21faW5kZXggKgoJICAgY29zKGF4aXNfc2xvcGVfYW5nbGUpKSk7CglheGlzX3Nsb3BlX2FuZ2xlID0gLXJhbmc7Cn0KCi8qICBQZXJmb3JtIHJheSB0cmFjZSBpbiBzcGVjaWZpYyBzcGVjdHJhbCBsaW5lICAqLwoKc3RhdGljIHRyYWNlX2xpbmUobGluZSwgcmF5X2gpCmludCBsaW5lOwpkb3VibGUgcmF5X2g7CnsKCWludCBpOwoKCW9iamVjdF9kaXN0YW5jZSA9IDAuMDsKCXJheV9oZWlnaHQgPSByYXlfaDsKCWZyb21faW5kZXggPSAxLjA7CgoJZm9yIChpID0gMTsgaSA8PSBjdXJyZW50X3N1cmZhY2VzOyBpKyspIHsKCSAgIHJhZGl1c19vZl9jdXJ2YXR1cmUgPSBzW2ldWzFdOwoJICAgdG9faW5kZXggPSBzW2ldWzJdOwoJICAgaWYgKHRvX2luZGV4ID4gMS4wKQoJICAgICAgdG9faW5kZXggPSB0b19pbmRleCArICgoc3BlY3RyYWxfbGluZVs0XSAtCgkJIHNwZWN0cmFsX2xpbmVbbGluZV0pIC8KCQkgKHNwZWN0cmFsX2xpbmVbM10gLSBzcGVjdHJhbF9saW5lWzZdKSkgKiAoKHNbaV1bMl0gLSAxLjApIC8KCQkgc1tpXVszXSk7CgkgICB0cmFuc2l0X3N1cmZhY2UoKTsKCSAgIGZyb21faW5kZXggPSB0b19pbmRleDsKCSAgIGlmIChpIDwgY3VycmVudF9zdXJmYWNlcykKCSAgICAgIG9iamVjdF9kaXN0YW5jZSA9IG9iamVjdF9kaXN0YW5jZSAtIHNbaV1bNF07Cgl9Cn0KCi8qICBJbml0aWFsaXNlIHdoZW4gY2FsbGVkIHRoZSBmaXJzdCB0aW1lICAqLwoKaW50Cm1haW4oYXJnYywgYXJndikKaW50IGFyZ2M7CmNoYXIgKmFyZ3ZbXTsKewoJaW50IGksIGosIGssIGVycm9yczsKCWRvdWJsZSBvZF9mbGluZSwgb2RfY2xpbmU7CiNpZmRlZiBBQ0NVUkFDWQoJbG9uZyBwYXNzZXM7CiNlbmRpZgoKCXNwZWN0cmFsX2xpbmVbMV0gPSA3NjIxLjA7CSAvKiBBICovCglzcGVjdHJhbF9saW5lWzJdID0gNjg2OS45NTU7CSAvKiBCICovCglzcGVjdHJhbF9saW5lWzNdID0gNjU2Mi44MTY7CSAvKiBDICovCglzcGVjdHJhbF9saW5lWzRdID0gNTg5NS45NDQ7CSAvKiBEICovCglzcGVjdHJhbF9saW5lWzVdID0gNTI2OS41NTc7CSAvKiBFICovCglzcGVjdHJhbF9saW5lWzZdID0gNDg2MS4zNDQ7CSAvKiBGICovCiAgICAgICAgc3BlY3RyYWxfbGluZVs3XSA9IDQzNDAuNDc3OyAgICAgLyogRycqLwoJc3BlY3RyYWxfbGluZVs4XSA9IDM5NjguNDk0OwkgLyogSCAqLwoKCS8qIFByb2Nlc3MgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIGFyZ3VtZW50LCBpZiBvbmUgaXMgc3VwcGxpZWQuICovCgogIG5pdGVyID0gMTAwMDAwMDsKCgkvKiBMb2FkIHRlc3QgY2FzZSBpbnRvIHdvcmtpbmcgYXJyYXkgKi8KCgljbGVhcl9hcGVydHVyZSA9IDQuMDsKCWN1cnJlbnRfc3VyZmFjZXMgPSA0OwoJZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfc3VyZmFjZXM7IGkrKykKCSAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCgkgICAgICBzW2kgKyAxXVtqICsgMV0gPSB0ZXN0Y2FzZVtpXVtqXTsKCiNpZmRlZiBBQ0NVUkFDWQogICAgICAgIHByaW50ZigiQmVnaW5uaW5nIGV4ZWN1dGlvbiBvZiBmbG9hdGluZyBwb2ludCBhY2N1cmFjeSB0ZXN0Li4uXG4iKTsKCXBhc3NlcyA9IDA7CiNlbHNlCiAgICAgICAgcHJpbnRmKCJSZWFkeSB0byBiZWdpbiBKb2huIFdhbGtlcidzIGZsb2F0aW5nIHBvaW50IGFjY3VyYWN5XG4iKTsKICAgICAgICBwcmludGYoImFuZCBwZXJmb3JtYW5jZSBiZW5jaG1hcmsuICAlZCBpdGVyYXRpb25zIHdpbGwgYmUgbWFkZS5cblxuIiwKCSAgIG5pdGVyKTsKCiAgICAgICAgcHJpbnRmKCJcbk1lYXN1cmVkIHJ1biB0aW1lIGluIHNlY29uZHMgc2hvdWxkIGJlIGRpdmlkZWQgYnkgJS5mXG4iLCBuaXRlciAvIDEwMDAuMCk7CiAgICAgICAgcHJpbnRmKCJ0byBub3JtYWxpc2UgZm9yIHJlcG9ydGluZyByZXN1bHRzLiAgRm9yIGFyY2hpdmFsIHJlc3VsdHMsXG4iKTsKICAgICAgICBwcmludGYoImFkanVzdCBpdGVyYXRpb24gY291bnQgc28gdGhlIGJlbmNobWFyayBydW5zIGFib3V0IGZpdmUgbWludXRlcy5cblxuIik7CiNlbmRpZgoKCS8qIFBlcmZvcm0gcmF5IHRyYWNlIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRpbWVzLiAqLwoKI2lmZGVmIEFDQ1VSQUNZCgl3aGlsZSAoVFJVRSkgewoJICAgcGFzc2VzKys7CgkgICBpZiAoKHBhc3NlcyAlIDEwMEwpID09IDApIHsKICAgICAgICAgICAgICBwcmludGYoIlBhc3MgJWxkLlxuIiwgcGFzc2VzKTsKCSAgIH0KI2Vsc2UKCWZvciAoaXRlcmNvdW50ID0gMDsgaXRlcmNvdW50IDwgbml0ZXI7IGl0ZXJjb3VudCsrKSB7CiNlbmRpZgoKCSAgIGZvciAocGFyYXhpYWwgPSAwOyBwYXJheGlhbCA8PSAxOyBwYXJheGlhbCsrKSB7CgoJICAgICAgLyogRG8gbWFpbiB0cmFjZSBpbiBEIGxpZ2h0ICovCgoJICAgICAgdHJhY2VfbGluZSg0LCBjbGVhcl9hcGVydHVyZSAvIDIuMCk7CgkgICAgICBvZF9zYVtwYXJheGlhbF1bMF0gPSBvYmplY3RfZGlzdGFuY2U7CgkgICAgICBvZF9zYVtwYXJheGlhbF1bMV0gPSBheGlzX3Nsb3BlX2FuZ2xlOwoJICAgfQoJICAgcGFyYXhpYWwgPSBGQUxTRTsKCgkgICAvKiBUcmFjZSBtYXJnaW5hbCByYXkgaW4gQyAqLwoKCSAgIHRyYWNlX2xpbmUoMywgY2xlYXJfYXBlcnR1cmUgLyAyLjApOwoJICAgb2RfY2xpbmUgPSBvYmplY3RfZGlzdGFuY2U7CgoJICAgLyogVHJhY2UgbWFyZ2luYWwgcmF5IGluIEYgKi8KCgkgICB0cmFjZV9saW5lKDYsIGNsZWFyX2FwZXJ0dXJlIC8gMi4wKTsKCSAgIG9kX2ZsaW5lID0gb2JqZWN0X2Rpc3RhbmNlOwoKCSAgIGFiZXJyX2xzcGhlciA9IG9kX3NhWzFdWzBdIC0gb2Rfc2FbMF1bMF07CgkgICBhYmVycl9vc2MgPSAxLjAgLSAob2Rfc2FbMV1bMF0gKiBvZF9zYVsxXVsxXSkgLwoJICAgICAgKHNpbihvZF9zYVswXVsxXSkgKiBvZF9zYVswXVswXSk7CgkgICBhYmVycl9sY2hyb20gPSBvZF9mbGluZSAtIG9kX2NsaW5lOwoJICAgbWF4X2xzcGhlciA9IHNpbihvZF9zYVswXVsxXSk7CgoJICAgLyogRCBsaWdodCAqLwoKCSAgIG1heF9sc3BoZXIgPSAwLjAwMDA5MjYgLyAobWF4X2xzcGhlciAqIG1heF9sc3BoZXIpOwoJICAgbWF4X29zYyA9IDAuMDAyNTsKCSAgIG1heF9sY2hyb20gPSBtYXhfbHNwaGVyOwojaWZuZGVmIEFDQ1VSQUNZCgl9CiNlbmRpZgoKCS8qIE5vdyBldmFsdWF0ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIHJlc3VsdHMgZnJvbSB0aGUgbGFzdCByYXkgdHJhY2UgKi8KCiAgICAgICAgc3ByaW50ZihvdXRhcnJbMF0sICIlMTVzICAgJTIxLjExZiAgJTE0LjExZiIsCiAgICAgICAgICAgIk1hcmdpbmFsIHJheSIsIG9kX3NhWzBdWzBdLCBvZF9zYVswXVsxXSk7CiAgICAgICAgc3ByaW50ZihvdXRhcnJbMV0sICIlMTVzICAgJTIxLjExZiAgJTE0LjExZiIsCiAgICAgICAgICAgIlBhcmF4aWFsIHJheSIsIG9kX3NhWzFdWzBdLCBvZF9zYVsxXVsxXSk7CglzcHJpbnRmKG91dGFyclsyXSwKICAgICAgICAgICAiTG9uZ2l0dWRpbmFsIHNwaGVyaWNhbCBhYmVycmF0aW9uOiAgICAgICUxNi4xMWYiLAoJICAgYWJlcnJfbHNwaGVyKTsKCXNwcmludGYob3V0YXJyWzNdLAogICAgICAgICAgICIgICAgKE1heGltdW0gcGVybWlzc2libGUpOiAgICAgICAgICAgICAgJTE2LjExZiIsCgkgICBtYXhfbHNwaGVyKTsKCXNwcmludGYob3V0YXJyWzRdLAogICAgICAgICAgICJPZmZlbnNlIGFnYWluc3Qgc2luZSBjb25kaXRpb24gKGNvbWEpOiAgJTE2LjExZiIsCgkgICBhYmVycl9vc2MpOwoJc3ByaW50ZihvdXRhcnJbNV0sCiAgICAgICAgICAgIiAgICAoTWF4aW11bSBwZXJtaXNzaWJsZSk6ICAgICAgICAgICAgICAlMTYuMTFmIiwKCSAgIG1heF9vc2MpOwoJc3ByaW50ZihvdXRhcnJbNl0sCiAgICAgICAgICAgIkF4aWFsIGNocm9tYXRpYyBhYmVycmF0aW9uOiAgICAgICAgICAgICAlMTYuMTFmIiwKCSAgIGFiZXJyX2xjaHJvbSk7CglzcHJpbnRmKG91dGFycls3XSwKICAgICAgICAgICAiICAgIChNYXhpbXVtIHBlcm1pc3NpYmxlKTogICAgICAgICAgICAgICUxNi4xMWYiLAoJICAgbWF4X2xjaHJvbSk7CgoJLyogTm93IGNvbXBhcmUgdGhlIGVkaXRlZCByZXN1bHRzIHdpdGggdGhlIG1hc3RlciB2YWx1ZXMgZnJvbQoJICAgcmVmZXJlbmNlIGV4ZWN1dGlvbnMgb2YgdGhpcyBwcm9ncmFtLiAqLwoKCWVycm9ycyA9IDA7Cglmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkgICBpZiAoc3RyY21wKG91dGFycltpXSwgcmVmYXJyW2ldKSAhPSAwKSB7CiNpZmRlZiBBQ0NVUkFDWQogICAgICAgICAgICAgIHByaW50ZigiXG5FcnJvciBpbiBwYXNzICVsZCBmb3IgcmVzdWx0cyBvbiBsaW5lICVkLi4uXG4iLAoJCSAgICAgcGFzc2VzLCBpICsgMSk7CiNlbHNlCiAgICAgICAgICAgICAgcHJpbnRmKCJcbkVycm9yIGluIHJlc3VsdHMgb24gbGluZSAlZC4uLlxuIiwgaSArIDEpOwojZW5kaWYKICAgICAgICAgICAgICBwcmludGYoIkV4cGVjdGVkOiAgXCIlc1wiXG4iLCByZWZhcnJbaV0pOwogICAgICAgICAgICAgIHByaW50ZigiUmVjZWl2ZWQ6ICBcIiVzXCJcbiIsIG91dGFycltpXSk7CiAgICAgICAgICAgICAgcHJpbnRmKCIoRXJyb3JzKSAgICAiKTsKCSAgICAgIGsgPSBzdHJsZW4ocmVmYXJyW2ldKTsKCSAgICAgIGZvciAoaiA9IDA7IGogPCBrOyBqKyspIHsKICAgICAgICAgICAgICAgICBwcmludGYoIiVjIiwgcmVmYXJyW2ldW2pdID09IG91dGFycltpXVtqXSA/ICcgJyA6ICdeJyk7CgkJIGlmIChyZWZhcnJbaV1bal0gIT0gb3V0YXJyW2ldW2pdKQoJCSAgICBlcnJvcnMrKzsKCSAgICAgIH0KICAgICAgICAgICAgICBwcmludGYoIlxuIik7CgkgICB9Cgl9CiNpZmRlZiBBQ0NVUkFDWQoJfQojZWxzZQoJaWYgKGVycm9ycyA+IDApIHsKICAgICAgICAgICBwcmludGYoIlxuJWQgZXJyb3IlcyBpbiByZXN1bHRzLiAgVGhpcyBpcyBWRVJZIFNFUklPVVMuXG4iLAogICAgICAgICAgICAgIGVycm9ycywgZXJyb3JzID4gMSA/ICJzIiA6ICIiKTsKCX0gZWxzZQogICAgICAgICAgIHByaW50ZigiXG5ObyBlcnJvcnMgaW4gcmVzdWx0cy5cbiIpOwojZW5kaWYKCXJldHVybiAwOwp9Cg==