LyoKICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogKgogKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFN1biBkZXNpZ25hdGVzIHRoaXMKICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAogKiBieSBTdW4gaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KICoKICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgogKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KICoKICogUGxlYXNlIGNvbnRhY3QgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiwgNDE1MCBOZXR3b3JrIENpcmNsZSwgU2FudGEgQ2xhcmEsCiAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCiAqIGhhdmUgYW55IHF1ZXN0aW9ucy4KICovCgovLyBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCi8vIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgovLyBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCi8vIGZpbGU6Ci8vCi8vCi8vICBMaXR0bGUgY21zCi8vICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNiBNYXJ0aSBNYXJpYQovLwovLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAovLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAovLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLy8KLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi8vCi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAovLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQovLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgovLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCgojaW5jbHVkZSAibGNtcy5oIgoKCi8qCnR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgZG91YmxlIEo7CiAgICAgICAgICAgICAgIGRvdWJsZSBDOwogICAgICAgICAgICAgICBkb3VibGUgaDsKCiAgICAgICAgICAgICAgIH0gY21zSkNoLCBGQVIqIExQY21zSkNoOwoKCiNkZWZpbmUgQVZHX1NVUlJPVU5EXzQgICAgIDAKI2RlZmluZSBBVkdfU1VSUk9VTkQgICAgICAgMQojZGVmaW5lIERJTV9TVVJST1VORCAgICAgICAyCiNkZWZpbmUgREFSS19TVVJST1VORCAgICAgIDMKI2RlZmluZSBDVVRTSEVFVF9TVVJST1VORCAgNAoKCnR5cGVkZWYgc3RydWN0IHsKCiAgICAgICAgICAgICAgY21zQ0lFWFlaIHdoaXRlUG9pbnQ7CiAgICAgICAgICAgICAgZG91YmxlICAgIFliOwogICAgICAgICAgICAgIGRvdWJsZSAgICBMYTsKICAgICAgICAgICAgICBpbnQgICAgICAgc3Vycm91bmQ7CiAgICAgICAgICAgICAgZG91YmxlICAgIERfdmFsdWU7CgogICAgICAgICAgICAgIH0gY21zVmlld2luZ0NvbmRpdGlvbnMsIEZBUiogTFBjbXNWaWV3aW5nQ29uZGl0aW9uczsKCgoKTENNU0FQSSBMQ01TSEFORExFIExDTVNFWFBPUlQgY21zQ0lFQ0FNOTdzSW5pdChMUGNtc1ZpZXdpbmdDb25kaXRpb25zIHBWQyk7CkxDTVNBUEkgdm9pZCAgIExDTVNFWFBPUlQgY21zQ0lFQ0FNOTdzRG9uZShMQ01TSEFORExFIGhNb2RlbCk7CkxDTVNBUEkgdm9pZCAgIExDTVNFWFBPUlQgY21zQ0lFQ0FNOTdzRm9yd2FyZChMQ01TSEFORExFIGhNb2RlbCwgTFBjbXNDSUVYWVogcEluLCBMUGNtc0pDaCBwT3V0KTsKTENNU0FQSSB2b2lkICAgTENNU0VYUE9SVCBjbXNDSUVDQU05N3NSZXZlcnNlKExDTVNIQU5ETEUgaE1vZGVsLCBMUGNtc0pDaCBwSW4sICAgIExQY21zQ0lFWFlaIHBPdXQpOwoKKi8KCi8vIC0tLS0tLS0tLS0gSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vICNkZWZpbmUgVVNFX0NJRUNBTTk3czIgIDEKCiNpZmRlZiBVU0VfQ0lFQ0FNOTdzMgoKIyAgICAgICBkZWZpbmUgTk9JU0VfQ09OU1RBTlQgICAzLjA1CiNlbHNlCiMgICAgICAgZGVmaW5lIE5PSVNFX0NPTlNUQU5UICAgMi4wNQojZW5kaWYKCgovKgogIFRoZSBtb2RlbCBpbnB1dCBkYXRhIGFyZSB0aGUgYWRhcHRpbmcgZmllbGQgbHVtaW5hbmNlIGluIGNkL20yCiAgKG5vcm1hbGx5IHRha2VuIHRvIGJlIDIwJSBvZiB0aGUgbHVtaW5hbmNlIG9mIHdoaXRlIGluIHRoZSBhZGFwdGluZyBmaWVsZCksCiAgTEEgLCB0aGUgcmVsYXRpdmUgdHJpc3RpbXVsdXMgdmFsdWVzIG9mIHRoZSBzdGltdWx1cywgWFlaLCB0aGUgcmVsYXRpdmUKICB0cmlzdGltdWx1cyB2YWx1ZXMgb2Ygd2hpdGUgaW4gdGhlIHNhbWUgdmlld2luZyBjb25kaXRpb25zLCBYdyBZdyBadyAsCiAgYW5kIHRoZSByZWxhdGl2ZSBsdW1pbmFuY2Ugb2YgdGhlIGJhY2tncm91bmQsIFliIC4gUmVsYXRpdmUgdHJpc3RpbXVsdXMKICB2YWx1ZXMgc2hvdWxkIGJlIGV4cHJlc3NlZCBvbiBhIHNjYWxlIGZyb20gWSA9IDAgZm9yIGEgcGVyZmVjdCBibGFjawogIHRvIFkgPSAxMDAgZm9yIGEgcGVyZmVjdCByZWZsZWN0aW5nIGRpZmZ1c2VyLiBBZGRpdGlvbmFsbHksIHRoZQogIHBhcmFtZXRlcnMgYywgZm9yIHRoZSBpbXBhY3Qgb2Ygc3Vycm91bmQsIE5jICwgYSBjaHJvbWF0aWMgaW5kdWN0aW9uIGZhY3RvciwKICBhbmQgRiwgYSBmYWN0b3IgZm9yIGRlZ3JlZSBvZiBhZGFwdGF0aW9uLCBtdXN0IGJlIHNlbGVjdGVkIGFjY29yZGluZyB0byB0aGUKICBndWlkZWxpbmVzIGluIHRhYmxlCgogIEFsbCBDSUUgdHJpc3RpbXVsdXMgdmFsdWVzIGFyZSBvYnRhaW5lZCB1c2luZyB0aGUgQ0lFIDE5MzEKICBTdGFuZGFyZCBDb2xvcmltZXRyaWMgT2JzZXJ2ZXIgKDKwKS4KCiovCgp0eXBlZGVmIHN0cnVjdCB7CgogICAgY21zQ0lFWFlaIFdQOwogICAgaW50IHN1cnJvdW5kOwogICAgaW50IGNhbGN1bGF0ZV9EOwoKICAgIGRvdWJsZSAgWWI7ICAgICAgICAgLy8gcmVsLiBsdW1pbmFuY2Ugb2YgYmFja2dyb3VuZAoKICAgIGNtc0NJRVhZWiBSZWZXaGl0ZTsKCiAgICBkb3VibGUgTGE7ICAgIC8vIFRoZSBhZGFwdGluZyBmaWVsZCBsdW1pbmFuY2UgaW4gY2QvbTIKCiAgICBkb3VibGUgYzsgICAgIC8vIEltcGFjdCBvZiBzdXJyb3VuZAogICAgZG91YmxlIE5jOyAgICAvLyBDaHJvbWF0aWMgaW5kdWN0aW9uIGZhY3RvcgogICAgZG91YmxlIEZsbDsgICAvLyBMaWdodG5lc3MgY29udHJhc3QgZmFjdG9yIChSZW1vdmVkIG9uIHJldiAyKQogICAgZG91YmxlIEY7ICAgICAvLyBEZWdyZWUgb2YgYWRhcHRhdGlvbgoKCiAgICBkb3VibGUgazsKICAgIGRvdWJsZSBGbDsKCiAgICBkb3VibGUgTmJiOyAgLy8gVGhlIGJhY2tncm91bmQgYW5kIGNocm9tYXRpYyBicmlnaHRuZXNzIGluZHVjdGlvbiBmYWN0b3JzLgogICAgZG91YmxlIE5jYjsKICAgIGRvdWJsZSB6OyAgICAvLyBiYXNlIGV4cG9uZW50aWFsIG5vbmxpbmVhcml0eQogICAgZG91YmxlIG47ICAgIC8vIGJhY2tncm91bmQgaW5kdWN0aW9uIGZhY3RvcgogICAgZG91YmxlIEQ7CgogICAgTUFUMyBNbGFtUmlnZzsKICAgIE1BVDMgTWxhbVJpZ2dfMTsKCiAgICBNQVQzIE1odW50OwogICAgTUFUMyBNaHVudF8xOwoKICAgIE1BVDMgTWh1bnRfeF9NbGFtUmlnZ18xOwogICAgTUFUMyBNbGFtUmlnZ194X01odW50XzE7CgoKICAgIFZFQzMgUkdCX3N1Ync7CiAgICBWRUMzIFJHQl9zdWJ3X3ByaW1lOwoKICAgIGRvdWJsZSBwOwoKICAgIFZFQzMgUkdCX3N1YndjOwoKICAgIFZFQzMgUkdCX3N1YmF3X3ByaW1lOwogICAgZG91YmxlIEFfc3VidzsKICAgIGRvdWJsZSBRX3N1Ync7CgogICAgfSBjbXNDSUVDQU05N3MsRkFSICpMUGNtc0NJRUNBTTk3czsKCgoKLy8gRnJlZSBtb2RlbCBzdHJ1Y3R1cmUKCkxDTVNBUEkgdm9pZCBMQ01TRVhQT1JUIGNtc0NJRUNBTTk3c0RvbmUoTENNU0hBTkRMRSBoTW9kZWwpCnsKICAgIExQY21zQ0lFQ0FNOTdzIGxwTW9kID0gKExQY21zQ0lFQ0FNOTdzKSAoTFBTVFIpIGhNb2RlbDsKICAgIGlmIChscE1vZCkgZnJlZShscE1vZCk7Cn0KCi8vIFBhcnRpYWwgZGlzY291bnRpbmcgZm9yIGFkYXB0YXRpb24gZGVncmVlIGNvbXB1dGF0aW9uCgpzdGF0aWMKZG91YmxlIGRpc2NvdW50KGRvdWJsZSBkLCBkb3VibGUgY2hhbikKewogICAgcmV0dXJuIChkICogY2hhbiArIDEgLSBkKTsKfQoKCi8vIFRoaXMgcm91dGluZSBkb2VzIG1vZGVsIGV4cG9uZW50aWFsIG5vbmxpbmVhcml0eSBvbiB0aGUgc2hvcnQgd2F2ZWxlbmdodAovLyBzZW5zaXRpdmUgY2hhbm5lbC4gT24gQ0lFQ0FNOTdzIHJldiAyIHRoaXMgaGFzIGJlZW4gcmV2ZXJ0ZWQgdG8gbGluZWFyLgoKc3RhdGljCnZvaWQgRndBZGFwdGF0aW9uRGVncmVlKExQY21zQ0lFQ0FNOTdzIGxwTW9kLCBMUFZFQzMgUkdCYywgTFBWRUMzIFJHQikKewoKCiNpZmRlZiBVU0VfQ0lFQ0FNOTdzMgogICAgUkdCYy0+blswXSA9IFJHQi0+blswXSogZGlzY291bnQobHBNb2QtPkQsIDEwMC4wL2xwTW9kLT5SR0Jfc3Vidy5uWzBdKTsKICAgIFJHQmMtPm5bMV0gPSBSR0ItPm5bMV0qIGRpc2NvdW50KGxwTW9kLT5ELCAxMDAuMC9scE1vZC0+UkdCX3N1YncublsxXSk7CiAgICBSR0JjLT5uWzJdID0gUkdCLT5uWzJdKiBkaXNjb3VudChscE1vZC0+RCwgMTAwLjAvbHBNb2QtPlJHQl9zdWJ3Lm5bMl0pOwojZWxzZQoKICAgIFJHQmMtPm5bMF0gPSBSR0ItPm5bMF0qIGRpc2NvdW50KGxwTW9kLT5ELCAxLjAvbHBNb2QtPlJHQl9zdWJ3Lm5bMF0pOwogICAgUkdCYy0+blsxXSA9IFJHQi0+blsxXSogZGlzY291bnQobHBNb2QtPkQsIDEuMC9scE1vZC0+UkdCX3N1YncublsxXSk7CgogICAgUkdCYy0+blsyXSA9IHBvdyhmYWJzKFJHQi0+blsyXSksIGxwTW9kIC0+cCkgKiBkaXNjb3VudChscE1vZC0+RCwgKDEuMC9wb3cobHBNb2QtPlJHQl9zdWJ3Lm5bMl0sIGxwTW9kLT5wKSkpOwoKICAgIC8vIElmIEIgaGFwcGVucyB0byBiZSBuZWdhdGl2ZSwgVGhlbiBCYyBpcyBhbHNvIHNldCB0byBiZSBuZWdhdGl2ZQoKICAgIGlmIChSR0ItPm5bMl0gPCAwKQogICAgICAgICAgIFJHQmMtPm5bMl0gPSAtUkdCYy0+blsyXTsKI2VuZGlmCn0KCgpzdGF0aWMKdm9pZCBSdkFkYXB0YXRpb25EZWdyZWUoTFBjbXNDSUVDQU05N3MgbHBNb2QsIExQVkVDMyBSR0JjLCBMUFZFQzMgUkdCKQp7CgoKI2lmZGVmIFVTRV9DSUVDQU05N3MyCiAgICBSR0JjLT5uWzBdID0gUkdCLT5uWzBdL2Rpc2NvdW50KGxwTW9kLT5ELCAxMDAuMC9scE1vZC0+UkdCX3N1YncublswXSk7CiAgICBSR0JjLT5uWzFdID0gUkdCLT5uWzFdL2Rpc2NvdW50KGxwTW9kLT5ELCAxMDAuMC9scE1vZC0+UkdCX3N1YncublsxXSk7CiAgICBSR0JjLT5uWzJdID0gUkdCLT5uWzJdL2Rpc2NvdW50KGxwTW9kLT5ELCAxMDAuMC9scE1vZC0+UkdCX3N1YncublsyXSk7CiNlbHNlCgogICAgUkdCYy0+blswXSA9IFJHQi0+blswXS9kaXNjb3VudChscE1vZC0+RCwgMS4wL2xwTW9kLT5SR0Jfc3Vidy5uWzBdKTsKICAgIFJHQmMtPm5bMV0gPSBSR0ItPm5bMV0vZGlzY291bnQobHBNb2QtPkQsIDEuMC9scE1vZC0+UkdCX3N1YncublsxXSk7CiAgICBSR0JjLT5uWzJdID0gcG93KGZhYnMoUkdCLT5uWzJdKSwgMS4wL2xwTW9kLT5wKS9wb3coZGlzY291bnQobHBNb2QtPkQsIDEuMC9wb3cobHBNb2QtPlJHQl9zdWJ3Lm5bMl0sIGxwTW9kLT5wKSksIDEuMC9scE1vZC0+cCk7CiAgICBpZiAoUkdCLT5uWzJdIDwgMCkKICAgICAgICAgICBSR0JjLT5uWzJdID0gLVJHQmMtPm5bMl07CiNlbmRpZgp9CgoKCnN0YXRpYwp2b2lkIFBvc3RBZGFwdGF0aW9uQ29uZVJlc3BvbnNlcyhMUGNtc0NJRUNBTTk3cyBscE1vZCwgTFBWRUMzIFJHQmFfcHJpbWUsIExQVkVDMyBSR0JwcmltZSkKewogICAgIGlmIChSR0JwcmltZS0+blswXT49MC4wKSB7CgogICAgICAgICAgICBSR0JhX3ByaW1lLT5uWzBdPSgoNDAuMCpwb3cobHBNb2QgLT4gRmwgKiBSR0JwcmltZS0+blswXS8xMDAuMCwgMC43MykpLyhwb3cobHBNb2QgLT4gRmwgKiBSR0JwcmltZS0+blswXS8xMDAuMCwgMC43MykrMikpKzE7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgICAgIFJHQmFfcHJpbWUtPm5bMF09KCgtNDAuMCpwb3coKC1scE1vZCAtPiBGbCAqIFJHQnByaW1lLT5uWzBdKS8xMDAuMCwgMC43MykpLyhwb3coKC1scE1vZCAtPiBGbCAqIFJHQnByaW1lLT5uWzBdKS8xMDAuMCwgMC43MykrMikpKzE7CiAgICAgfQoKICAgICBpZiAoUkdCcHJpbWUtPm5bMV0+PTAuMCkKICAgICB7CiAgICAgICAgICAgIFJHQmFfcHJpbWUtPm5bMV09KCg0MC4wKnBvdyhscE1vZCAtPiBGbCAqIFJHQnByaW1lLT5uWzFdLzEwMC4wLCAwLjczKSkvKHBvdyhscE1vZCAtPiBGbCAqIFJHQnByaW1lLT5uWzFdLzEwMC4wLCAwLjczKSsyKSkrMTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgICAgUkdCYV9wcmltZS0+blsxXT0oKC00MC4wKnBvdygoLWxwTW9kIC0+IEZsICogUkdCcHJpbWUtPm5bMV0pLzEwMC4wLCAwLjczKSkvKHBvdygoLWxwTW9kIC0+IEZsICogUkdCcHJpbWUtPm5bMV0pLzEwMC4wLCAwLjczKSsyKSkrMTsKICAgICB9CgogICAgIGlmIChSR0JwcmltZS0+blsyXT49MC4wKQogICAgIHsKICAgICAgICAgICAgUkdCYV9wcmltZS0+blsyXT0oKDQwLjAqcG93KGxwTW9kIC0+IEZsICogUkdCcHJpbWUtPm5bMl0vMTAwLjAsIDAuNzMpKS8ocG93KGxwTW9kIC0+IEZsICogUkdCcHJpbWUtPm5bMl0vMTAwLjAsIDAuNzMpKzIpKSsxOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgICAgICBSR0JhX3ByaW1lLT5uWzJdPSgoLTQwLjAqcG93KCgtbHBNb2QgLT4gRmwgKiBSR0JwcmltZS0+blsyXSkvMTAwLjAsIDAuNzMpKS8ocG93KCgtbHBNb2QgLT4gRmwgKiBSR0JwcmltZS0+blsyXSkvMTAwLjAsIDAuNzMpKzIpKSsxOwogICAgIH0KfQoKCi8vIENvbXB1dGUgaHVlIHF1YWRyYXR1cmUsIGVjY2VudHJpY2l0eSBmYWN0b3IsIGUKCnN0YXRpYwp2b2lkIENvbXB1dGVIdWVRdWFkcmF0dXJlKGRvdWJsZSBoLCBkb3VibGUqIEgsIGRvdWJsZSogZSkKewoKCiNkZWZpbmUgSVJFRCAgICAwCiNkZWZpbmUgSVlFTExPVyAxCiNkZWZpbmUgSUdSRUVOICAyCiNkZWZpbmUgSUJMVUUgICAzCgogICAgICBkb3VibGUgZV90YWJbXSA9IHswLjgsIDAuNywgMS4wLCAxLjJ9OwogICAgICBkb3VibGUgSF90YWJbXSA9IHsgIDAsIDEwMCwgMjAwLCAzMDB9OwogICAgICBpbnQgcDEsIHAyOwogICAgICBkb3VibGUgZTEsIGUyLCBoMSwgaDI7CgoKICAgICAgIGlmIChoID49IDIwLjE0ICYmIGggPCA5MC4wKSB7IC8vIFJlZAoKICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBJUkVEOwogICAgICAgICAgICAgICAgICAgICAgICBwMiA9IElZRUxMT1c7CiAgICAgICB9CiAgICAgICBlbHNlCiAgICAgICBpZiAoaCA+PSA5MC4wICYmIGggPCAxNjQuMjUpIHsgLy8gWWVsbG93CgogICAgICAgICAgICAgICAgICAgICAgICBwMSA9IElZRUxMT1c7CiAgICAgICAgICAgICAgICAgICAgICAgIHAyID0gSUdSRUVOOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgaWYgKGggPj0gMTY0LjI1ICYmIGggPCAyMzcuNTMpIHsgLy8gR3JlZW4KCiAgICAgICAgICAgICAgICAgICAgICAgIHAxID0gSUdSRUVOOwogICAgICAgICAgICAgICAgICAgICAgICBwMiA9IElCTFVFOyAgICAgICB9CiAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmx1ZQoKICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBJQkxVRTsKICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSBJUkVEOwogICAgICAgfQoKICAgICAgIGUxID0gZV90YWJbcDFdOyBlMiA9IGVfdGFiW3AyXTsKICAgICAgIGgxID0gSF90YWJbcDFdOyBoMiA9IEhfdGFiW3AyXTsKCgoKICAgICAgICplID0gZTEgKyAoKGUyLWUxKSooaC1oMSkvKGgyIC0gaDEpKTsKICAgICAgICpIID0gaDEgKyAoMTAwLiAqIChoIC0gaDEpIC8gZTEpIC8gKChoIC0gaDEpL2UxICsgKGgyIC0gaCkgLyBlMik7CgojdW5kZWYgSVJFRAojdW5kZWYgSVlFTExPVwojdW5kZWYgSUdSRUVOCiN1bmRlZiBJQkxVRQoKfQoKCgoKCgpMQ01TQVBJIExDTVNIQU5ETEUgTENNU0VYUE9SVCBjbXNDSUVDQU05N3NJbml0KExQY21zVmlld2luZ0NvbmRpdGlvbnMgcFZDKQp7CiAgICBMUGNtc0NJRUNBTTk3cyBscE1vZDsKICAgIFZFQzMgdG1wOwoKICAgIGlmKChscE1vZCA9IChMUGNtc0NJRUNBTTk3cykgbWFsbG9jKHNpemVvZihjbXNDSUVDQU05N3MpKSkgPT0gTlVMTCkgewogICAgICAgIHJldHVybiAoTENNU0hBTkRMRSkgTlVMTDsKICAgIH0KCgogICAgbHBNb2QtPldQLlggPSBwVkMtPndoaXRlUG9pbnQuWDsKICAgIGxwTW9kLT5XUC5ZID0gcFZDLT53aGl0ZVBvaW50Llk7CiAgICBscE1vZC0+V1AuWiA9IHBWQy0+d2hpdGVQb2ludC5aOwoKICAgIGxwTW9kLT5ZYiAgID0gcFZDLT5ZYjsKICAgIGxwTW9kLT5MYSAgID0gcFZDLT5MYTsKCiAgICBscE1vZC0+c3Vycm91bmQgPSBwVkMtPnN1cnJvdW5kOwoKICAgIGxwTW9kLT5SZWZXaGl0ZS5YID0gMTAwLjA7CiAgICBscE1vZC0+UmVmV2hpdGUuWSA9IDEwMC4wOwogICAgbHBNb2QtPlJlZldoaXRlLlogPSAxMDAuMDsKCiNpZmRlZiBVU0VfQ0lFQ0FNOTdzMgoKICAgIFZFQzNpbml0KCZscE1vZC0+TWxhbVJpZ2cudlswXSwgIDAuODU2MiwgMC4zMzcyLCAtMC4xOTM0KTsKICAgIFZFQzNpbml0KCZscE1vZC0+TWxhbVJpZ2cudlsxXSwgLTAuODM2MCwgMS44MzI3LCAgMC4wMDMzKTsKICAgIFZFQzNpbml0KCZscE1vZC0+TWxhbVJpZ2cudlsyXSwgIDAuMDM1NywtMC4wNDY5LCAgMS4wMTEyKTsKCiAgICBWRUMzaW5pdCgmbHBNb2QtPk1sYW1SaWdnXzEudlswXSwgMC45ODc0LCAtMC4xNzY4LCAwLjE4OTQpOwogICAgVkVDM2luaXQoJmxwTW9kLT5NbGFtUmlnZ18xLnZbMV0sIDAuNDUwNCwgIDAuNDY0OSwgMC4wODQ2KTsKICAgIFZFQzNpbml0KCZscE1vZC0+TWxhbVJpZ2dfMS52WzJdLC0wLjAxMzksICAwLjAyNzgsIDAuOTg2MSk7CgojZWxzZQogICAgLy8gQnJhZGZvcmQgdHJhbnNmb3JtOiBMYW0tUmlnZyBjb25lIHJlc3BvbnNlcwogICAgVkVDM2luaXQoJmxwTW9kLT5NbGFtUmlnZy52WzBdLCAgMC44OTUxLCAgMC4yNjY0LCAtMC4xNjE0KTsKICAgIFZFQzNpbml0KCZscE1vZC0+TWxhbVJpZ2cudlsxXSwgLTAuNzUwMiwgIDEuNzEzNSwgIDAuMDM2Nyk7CiAgICBWRUMzaW5pdCgmbHBNb2QtPk1sYW1SaWdnLnZbMl0sICAwLjAzODksIC0wLjA2ODUsICAxLjAyOTYpOwoKCiAgICAvLyBJbnZlcnNlIG9mIExhbS1SaWdnCiAgICBWRUMzaW5pdCgmbHBNb2QtPk1sYW1SaWdnXzEudlswXSwgIDAuOTg2OTksIC0wLjE0NzA1LCAgMC4xNTk5Nik7CiAgICBWRUMzaW5pdCgmbHBNb2QtPk1sYW1SaWdnXzEudlsxXSwgIDAuNDMyMzEsICAwLjUxODM2LCAgMC4wNDkyOSk7CiAgICBWRUMzaW5pdCgmbHBNb2QtPk1sYW1SaWdnXzEudlsyXSwgLTAuMDA4NTMsICAwLjA0MDA0LCAgMC45Njg0OSk7CgojZW5kaWYKCiAgICAvLyBIdW50LVBvaW50ZXItRXN0ZXZleiBjb25lIHJlc3BvbnNlcwogICAgVkVDM2luaXQoJmxwTW9kLT5NaHVudC52WzBdLCAgIDAuMzg5NzEsICAwLjY4ODk4LCAtMC4wNzg2OCk7CiAgICBWRUMzaW5pdCgmbHBNb2QtPk1odW50LnZbMV0sICAtMC4yMjk4MSwgIDEuMTgzNDAsICAwLjA0NjQxKTsKICAgIFZFQzNpbml0KCZscE1vZC0+TWh1bnQudlsyXSwgICAwLjAsICAgICAgMC4wLCAgICAgIDEuMCk7CgogICAgLy8gSW52ZXJzZSBvZiBIdW50LVBvaW50ZXItRXN0ZXZlegogICAgVkVDM2luaXQoJmxwTW9kLT5NaHVudF8xLnZbMF0sICAgICAxLjkxMDE5LCAtMS4xMTIxNCwgMC4yMDE5NSk7CiAgICBWRUMzaW5pdCgmbHBNb2QtPk1odW50XzEudlsxXSwgICAgIDAuMzcwOTUsICAwLjYyOTA1LCAwLjApOwogICAgVkVDM2luaXQoJmxwTW9kLT5NaHVudF8xLnZbMl0sICAgICAwLjAsICAgICAgMC4wLCAgICAgMS4wKTsKCgogICAgaWYgKHBWQy0+RF92YWx1ZSA9PSAtMS4wKQogICAgICAgICAgbHBNb2QtPmNhbGN1bGF0ZV9EID0gMTsKICAgIGVsc2UKICAgIGlmIChwVkMtPkRfdmFsdWUgPT0gLTIuMCkKICAgICAgICAgICBscE1vZC0+Y2FsY3VsYXRlX0QgPSAyOwogICAgZWxzZSB7CiAgICAgICAgbHBNb2QtPmNhbGN1bGF0ZV9EID0gMDsKICAgICAgICBscE1vZC0+RCA9IHBWQy0+RF92YWx1ZTsKICAgIH0KCiAgIC8vIFRhYmxlIEkgKHJldmlzZWQpCgogICBzd2l0Y2ggKGxwTW9kLT5zdXJyb3VuZCkgewoKICAgIGNhc2UgQVZHX1NVUlJPVU5EXzQ6CiAgICAgICBscE1vZC0+RiA9IDEuMDsKICAgICAgIGxwTW9kLT5jID0gMC42OTsKICAgICAgIGxwTW9kLT5GbGwgPSAwLjA7ICAgIC8vIE5vdCBpbmNsdWRlZCBvbiBSZXYgMgogICAgICAgbHBNb2QtPk5jID0gMS4wOwogICAgICAgYnJlYWs7CiAgICBjYXNlIEFWR19TVVJST1VORDoKICAgICAgIGxwTW9kLT5GID0gMS4wOwogICAgICAgbHBNb2QtPmMgPSAwLjY5OwogICAgICAgbHBNb2QtPkZsbCA9IDEuMDsKICAgICAgIGxwTW9kLT5OYyA9IDEuMDsKICAgICAgIGJyZWFrOwogICAgY2FzZSBESU1fU1VSUk9VTkQ6CiAgICAgICBscE1vZC0+RiA9IDAuOTk7CiAgICAgICBscE1vZC0+YyA9IDAuNTk7CiAgICAgICBscE1vZC0+RmxsID0gMS4wOwogICAgICAgbHBNb2QtPk5jID0gMC45NTsKICAgICAgIGJyZWFrOwogICAgY2FzZSBEQVJLX1NVUlJPVU5EOgogICAgICAgbHBNb2QtPkYgPSAwLjk7CiAgICAgICBscE1vZC0+YyA9IDAuNTI1OwogICAgICAgbHBNb2QtPkZsbCA9IDEuMDsKICAgICAgIGxwTW9kLT5OYyA9IDAuODsKICAgICAgIGJyZWFrOwogICAgY2FzZSBDVVRTSEVFVF9TVVJST1VORDoKICAgICAgIGxwTW9kLT5GID0gMC45OwogICAgICAgbHBNb2QtPmMgPSAwLjQxOwogICAgICAgbHBNb2QtPkZsbCA9IDEuMDsKICAgICAgIGxwTW9kLT5OYyA9IDAuODsKICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgIGxwTW9kLT5GID0gMS4wOwogICAgICAgbHBNb2QtPmMgPSAwLjY5OwogICAgICAgbHBNb2QtPkZsbCA9IDEuMDsKICAgICAgIGxwTW9kLT5OYyA9IDEuMDsKICAgICAgIGJyZWFrOwogICAgfQoKICAgIGxwTW9kLT5rID0gMSAvICg1ICogbHBNb2QtPkxhICArIDEpOwogICAgbHBNb2QtPkZsID0gbHBNb2QtPkxhICogcG93KGxwTW9kLT5rLCA0KSArIDAuMSpwb3coMSAtIHBvdyhscE1vZC0+aywgNCksIDIuMCkgKiBwb3coNSpscE1vZC0+TGEsIDEuMC8zLjApOwoKICAgIGlmIChscE1vZC0+Y2FsY3VsYXRlX0QgPiAwKSB7CgogICAgICAgbHBNb2QtPkQgPSBscE1vZC0+RiAqICgxIC0gMSAvICgxICsgMipwb3cobHBNb2QtPkxhLCAwLjI1KSArIHBvdyhscE1vZC0+TGEsIDIpLzMwMC4wKSk7CiAgICAgICBpZiAobHBNb2QtPmNhbGN1bGF0ZV9EID4gMSkKICAgICAgICAgICBscE1vZC0+RCA9IChscE1vZC0+RCArIDEuMCkgLyAyOwogICAgfQoKCiAgICAvLyBSR0Jfc3VidyA9IFtNbGFtUmlnZ11bV1AvWVdwXQojaWZkZWYgVVNFX0NJRUNBTTk3czIKICAgIE1BVDNldmFsKCZscE1vZCAtPiBSR0Jfc3VidywgJmxwTW9kIC0+IE1sYW1SaWdnLCAoTFBWRUMzKSAmbHBNb2QgLT4gV1ApOwojZWxzZQogICAgVkVDM2RpdksoJnRtcCwgKExQVkVDMykgJmxwTW9kIC0+IFdQLCBscE1vZC0+V1AuWSk7CiAgICBNQVQzZXZhbCgmbHBNb2QgLT4gUkdCX3N1YncsICZscE1vZCAtPiBNbGFtUmlnZywgJnRtcCk7CiNlbmRpZgoKCgogICAgTUFUM3BlcigmbHBNb2QgLT4gTWh1bnRfeF9NbGFtUmlnZ18xLCAgICZscE1vZCAtPiBNaHVudCwgICAmbHBNb2QtPk1sYW1SaWdnXzEgICk7CiAgICBNQVQzcGVyKCZscE1vZCAtPiBNbGFtUmlnZ194X01odW50XzEsICAgJmxwTW9kIC0+IE1sYW1SaWdnLCAmbHBNb2QgLT4gTWh1bnRfMSAgKTsKCiAgICAvLyBwIGlzIHVzZWQgb24gZm9yd2FyZCBtb2RlbAogICAgbHBNb2QtPnAgPSBwb3cobHBNb2QtPlJHQl9zdWJ3Lm5bMl0sIDAuMDgzNCk7CgogICAgRndBZGFwdGF0aW9uRGVncmVlKGxwTW9kLCAmbHBNb2QtPlJHQl9zdWJ3YywgJmxwTW9kLT5SR0Jfc3Vidyk7CgojaWYgVVNFX0NJRUNBTTk3czIKICAgIE1BVDNldmFsKCZscE1vZC0+UkdCX3N1YndfcHJpbWUsICZscE1vZC0+TWh1bnRfeF9NbGFtUmlnZ18xLCAmbHBNb2QgLT4gUkdCX3N1YndjKTsKI2Vsc2UKICAgIFZFQzNwZXJLKCZ0bXAsICZscE1vZCAtPiBSR0Jfc3Vid2MsIGxwTW9kLT5XUC5ZKTsKICAgIE1BVDNldmFsKCZscE1vZC0+UkdCX3N1YndfcHJpbWUsICZscE1vZC0+TWh1bnRfeF9NbGFtUmlnZ18xLCAmdG1wKTsKI2VuZGlmCgogICAgbHBNb2QtPm4gPSBscE1vZC0+IFliIC8gbHBNb2QtPiBXUC5ZOwoKICAgIGxwTW9kLT56ID0gMSArIGxwTW9kLT5GbGwgKiBzcXJ0KGxwTW9kLT5uKTsKICAgIGxwTW9kLT5OYmIgPSBscE1vZC0+TmNiID0gMC43MjUgLyBwb3cobHBNb2QtPm4sIDAuMik7CgogICAgUG9zdEFkYXB0YXRpb25Db25lUmVzcG9uc2VzKGxwTW9kLCAmbHBNb2QtPlJHQl9zdWJhd19wcmltZSwgJmxwTW9kLT5SR0Jfc3Vid19wcmltZSk7CgogICAgbHBNb2QtPkFfc3Vidz1scE1vZC0+TmJiKigyLjAqbHBNb2QtPlJHQl9zdWJhd19wcmltZS5uWzBdK2xwTW9kLT5SR0Jfc3ViYXdfcHJpbWUublsxXStscE1vZC0+UkdCX3N1YmF3X3ByaW1lLm5bMl0vMjAuMC1OT0lTRV9DT05TVEFOVCk7CgogICAgcmV0dXJuIChMQ01TSEFORExFKSBscE1vZDsKfQoKCgoKLy8KLy8gVGhlIGZvcndhcmQgbW9kZWw6IFhZWiAtPiBKQ2gKLy8KCkxDTVNBUEkgdm9pZCBMQ01TRVhQT1JUIGNtc0NJRUNBTTk3c0ZvcndhcmQoTENNU0hBTkRMRSBoTW9kZWwsIExQY21zQ0lFWFlaIGluUHRyLCBMUGNtc0pDaCBvdXRQdHIpCnsKCiAgICAgICAgTFBjbXNDSUVDQU05N3MgbHBNb2QgPSAoTFBjbXNDSUVDQU05N3MpIChMUFNUUikgaE1vZGVsOwogICAgICAgIGRvdWJsZSBhLCBiLCBoLCBzLCBIMXZhbCwgZXMsIEE7CiAgICAgICAgVkVDMyBJbiwgUkdCLCBSR0JjLCBSR0JwcmltZSwgUkdCYV9wcmltZTsKCiAgICAgICAgaWYgKGluUHRyIC0+IFkgPD0gMC4wKSB7CgogICAgICBvdXRQdHIgLT4gSiA9IG91dFB0ciAtPiBDID0gb3V0UHRyIC0+IGggPSAwLjA7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgIC8vIEFuIGluaXRpYWwgY2hyb21hdGljIGFkYXB0YXRpb24gdHJhbnNmb3JtIGlzIHVzZWQgdG8gZ28gZnJvbSB0aGUgc291cmNlCiAgICAgICAvLyB2aWV3aW5nIGNvbmRpdGlvbnMgdG8gY29ycmVzcG9uZGluZyBjb2xvdXJzIHVuZGVyIHRoZSBlcXVhbC1lbmVyZ3ktaWxsdW1pbmFudAogICAgICAgLy8gcmVmZXJlbmNlIHZpZXdpbmcgY29uZGl0aW9ucy4gVGhpcyBpcyBoYW5kbGVkIGRpZmZlcmVudGx5IG9uIHJldiAyCgogICAgICAgVkVDM2luaXQoJkluLCBpblB0ciAtPiBYLCBpblB0ciAtPiBZLCBpblB0ciAtPiBaKTsgICAgLy8gMi4xCgojaWZkZWYgVVNFX0NJRUNBTTk3czIKICAgICAgIC8vIFNpbmNlIHRoZSBjaHJvbWF0aWMgYWRhcHRhdGlvbiB0cmFuc2Zvcm0gaGFzIGJlZW4gbGluZWFyaXplZCwgaXQKICAgICAgIC8vIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBkaXZpZGUgdGhlIHN0aW11bHVzIHRyaXN0aW11bHVzIHZhbHVlcwogICAgICAgLy8gYnkgdGhlaXIgb3duIFkgdHJpc3RpbXVsdXMgdmFsdWUgcHJpb3IgdG8gdGhlIGNocm9tYXRpYyBhZGFwdGF0aW9uLgojZWxzZQogICAgICAgVkVDM2RpdksoJkluLCAmSW4sIGluUHRyIC0+IFkpOwojZW5kaWYKCiAgICAgICBNQVQzZXZhbCgmUkdCLCAmbHBNb2QgLT4gTWxhbVJpZ2csICZJbik7ICAgICAgICAgICAgICAvLyAyLjIKCiAgICAgICBGd0FkYXB0YXRpb25EZWdyZWUobHBNb2QsICZSR0JjLCAmUkdCKTsKCiAgICAgICAvLyBUaGUgcG9zdC1hZGFwdGF0aW9uIHNpZ25hbHMgZm9yIGJvdGggdGhlIHNhbXBsZSBhbmQgdGhlIHdoaXRlIGFyZSB0aGVuCiAgICAgICAvLyB0cmFuc2Zvcm1lZCBmcm9tIHRoZSBzaGFycGVuZWQgY29uZSByZXNwb25zZXMgdG8gdGhlIEh1bnQtUG9pbnRlci1Fc3RldmV6CiAgICAgICAvLyBjb25lIHJlc3BvbnNlcy4KI2lmZGVmIFVTRV9DSUVDQU05N3MyCiNlbHNlCiAgICAgICBWRUMzcGVySygmUkdCYywgJlJHQmMsIGluUHRyLT5ZKTsKI2VuZGlmCgogICAgICAgTUFUM2V2YWwoJlJHQnByaW1lLCAmbHBNb2QtPk1odW50X3hfTWxhbVJpZ2dfMSwgJlJHQmMpOwoKICAgICAgIC8vIFRoZSBwb3N0LWFkYXB0YXRpb24gY29uZSByZXNwb25zZXMgKGZvciBib3RoIHRoZSBzdGltdWx1cyBhbmQgdGhlIHdoaXRlKQogICAgICAgLy8gYXJlIHRoZW4gY2FsY3VsYXRlZC4KCiAgICAgICBQb3N0QWRhcHRhdGlvbkNvbmVSZXNwb25zZXMobHBNb2QsICZSR0JhX3ByaW1lLCAmUkdCcHJpbWUpOwoKICAgICAgIC8vIFByZWxpbWluYXJ5IHJlZC1ncmVlbiBhbmQgeWVsbG93LWJsdWUgb3Bwb25lbnQgZGltZW5zaW9ucyBhcmUgY2FsY3VsYXRlZAoKICAgICAgIGEgPSBSR0JhX3ByaW1lLm5bMF0gLSAoMTIuMCAqIFJHQmFfcHJpbWUublsxXSAvIDExLjApICsgUkdCYV9wcmltZS5uWzJdLzExLjA7CiAgICAgICBiID0gKFJHQmFfcHJpbWUublswXSArIFJHQmFfcHJpbWUublsxXSAtIDIuMCAqIFJHQmFfcHJpbWUublsyXSkgLyA5LjA7CgoKICAgICAgIC8vIFRoZSBDSUVDQU05N3MgaHVlIGFuZ2xlLCBoLCBpcyB0aGVuIGNhbGN1bGF0ZWQKICAgICAgIGggPSAoMTgwLjAvTV9QSSkqKGF0YW4yKGIsIGEpKTsKCgogICAgICAgd2hpbGUgKGggPCAwKQogICAgICAgICAgICAgIGggKz0gMzYwLjA7CgogICAgICAgb3V0UHRyLT5oID0gaDsKCiAgICAgICAvLyBodWUgcXVhZHJhdHVyZSBhbmQgZWNjZW50cmljaXR5IGZhY3RvcnMsIGUsIGFyZSBjYWxjdWxhdGVkCgogICAgICAgQ29tcHV0ZUh1ZVF1YWRyYXR1cmUoaCwgJkgxdmFsLCAmZXMpOwoKICAgICAgIC8vIENvbXB1dGVIdWVRdWFkcmF0dXJlKGgsICZIMXZhbCwgJmgxLCAmZTEsICZoMiwgJmUyLCAmZXMpOwoKCiAgICAgIC8vIFRoZSBhY2hyb21hdGljIHJlc3BvbnNlIEEKICAgICAgQSA9IGxwTW9kLT5OYmIgKiAoMi4wICogUkdCYV9wcmltZS5uWzBdICsgUkdCYV9wcmltZS5uWzFdICsgUkdCYV9wcmltZS5uWzJdLzIwLjAgLSBOT0lTRV9DT05TVEFOVCk7CgogICAgICAvLyBDSUVDQU05N3MgTGlnaHRuZXNzIEoKICAgICAgb3V0UHRyIC0+IEogPSAxMDAuMCAqIHBvdyhBIC8gbHBNb2QtPkFfc3VidywgbHBNb2QtPmMgKiBscE1vZC0+eik7CgogICAgICAvLyBDSUVDQU05N3Mgc2F0dXJhdGlvbiBzCiAgICAgIHMgPSAgKDUwICogaHlwb3QgKGEsIGIpICogMTAwICogZXMgKiAoMTAuMC8xMy4wKSAqIGxwTW9kLT4gTmMgKiBscE1vZC0+TmNiKSAvIChSR0JhX3ByaW1lLm5bMF0gKyBSR0JhX3ByaW1lLm5bMV0gKyAxLjA1ICogUkdCYV9wcmltZS5uWzJdKTsKCiAgICAgIC8vIENJRUNBTTk3cyBDaHJvbWEgQwoKI2lmZGVmIFVTRV9DSUVDQU05N3MyCiAgICAgIC8vIEVxLiAyNiBoYXMgYmVlbiBtb2RpZmllZCB0byBhbGxvdyBhY2N1cmF0ZSBwcmVkaWN0aW9uIG9mIHRoZSBNdW5zZWxsIGNocm9tYSBzY2FsZXMuCiAgICAgIG91dFB0ci0+QyA9IDAuNzQ4NyAqIHBvdyhzLCAwLjk3MykgKiBwb3cob3V0UHRyLT5KLzEwMC4wLCAwLjk0NSAqIGxwTW9kLT5uKSAqICgxLjY0IC0gcG93KDAuMjksIGxwTW9kLT5uKSk7CgojZWxzZQogICAgICBvdXRQdHItPkMgPSAyLjQ0ICogcG93KHMsIDAuNjkpICogcG93KG91dFB0ci0+Si8xMDAuMCwgMC42NyAqIGxwTW9kLT5uKSAqICgxLjY0IC0gcG93KDAuMjksIGxwTW9kLT5uKSk7CiNlbmRpZgp9CgoKLy8KLy8gVGhlIHJldmVyc2UgbW9kZWwgSkNoIC0+IFhZWgovLwoKCkxDTVNBUEkgdm9pZCBMQ01TRVhQT1JUIGNtc0NJRUNBTTk3c1JldmVyc2UoTENNU0hBTkRMRSBoTW9kZWwsIExQY21zSkNoIGluUHRyLCBMUGNtc0NJRVhZWiBvdXRQdHIpCnsKICAgIExQY21zQ0lFQ0FNOTdzIGxwTW9kID0gKExQY21zQ0lFQ0FNOTdzKSAoTFBTVFIpIGhNb2RlbDsKICAgIGRvdWJsZSBKLCBDLCBoLCBBLCBIMXZhbCwgZXMsIHMsIGEsIGI7CiAgICBkb3VibGUgdGFuX2gsIHNlY19oOwogICAgZG91YmxlIFJfc3ViYV9wcmltZSwgR19zdWJhX3ByaW1lLCBCX3N1YmFfcHJpbWU7CiAgICBkb3VibGUgUl9wcmltZSwgR19wcmltZSwgQl9wcmltZTsKICAgIGRvdWJsZSBZX3N1YmMsIFlfcHJpbWUsIEJfdGVybTsKICAgIFZFQzMgdG1wOwogICAgVkVDMyBSR0JfcHJpbWUsIFJHQl9zdWJjX1k7CiAgICBWRUMzIFlfb3Zlcl9ZX3N1YmNfUkdCOwogICAgVkVDMyBYWVpfcHJpbWVwcmltZV9vdmVyX1lfc3ViYzsKI2lmZGVmIFVTRV9DSUVDQU05MnMyCiAgICBWRUMzIFJHQlk7CiAgICBWRUMzIE91dDsKI2VuZGlmCgogICAgSiA9IGluUHRyLT5KOwogICAgaCA9IGluUHRyLT5oOwogICAgQyA9IGluUHRyLT5DOwoKICAgIGlmIChKIDw9IDApIHsKCiAgICAgICAgb3V0UHRyLT5YID0gIDAuMDsKICAgICAgICBvdXRQdHItPlkgPSAgMC4wOwogICAgICAgIG91dFB0ci0+WiA9ICAwLjA7CiAgICAgICAgcmV0dXJuOwogICAgfQoKCgogICAgLy8gKDIpIEZyb20gSiBPYnRhaW4gQQoKICAgIEEgPSAgcG93KEovMTAwLjAsIDEvKGxwTW9kLT5jICogbHBNb2QtPnopKSAqIGxwTW9kLT5BX3N1Ync7CgoKICAgIC8vICgzKSwgKDQpLCAoNSkgVXNpbmcgSCBEZXRlcm1pbmUgaDEsIGgyLCBlMSwgZTIKICAgIC8vIGUxIGFuZCBoMSBhcmUgdGhlIHZhbHVlcyAgb2YgZSBhbmQgaCBmb3IgdGhlIHVuaXF1ZSBodWUgaGF2aW5nIHRoZQogICAgLy8gbmVhcmVzdCBsb3dlciB2YWx1ciBvZiBoIGFuZCBlMiBhbmQgaDIgYXJlIHRoZSB2YWx1ZXMgb2YgZSBhbmQgaCBmb3IKICAgIC8vIHRoZSB1bmlxdWUgaHVlIGhhdmluZyB0aGUgbmVhcmVzdCBoaWdoZXIgdmFsdWUgb2YgaC4KCgogICAgQ29tcHV0ZUh1ZVF1YWRyYXR1cmUoaCwgJkgxdmFsLCAmZXMpOwoKICAgIC8vICg3KSBDYWxjdWxhdGUgcwoKICAgIHMgPSBwb3coQyAvICgyLjQ0ICogcG93KEovMTAwLjAsIDAuNjcqbHBNb2QtPm4pICogKDEuNjQgLSBwb3coMC4yOSwgbHBNb2QtPm4pKSkgLCAoMS4vMC42OSkpOwoKCiAgICAvLyAoOCkgQ2FsY3VsYXRlIGEgYW5kIGIuCiAgICAvLyBOT1RFOiBzcXJ0KDEgKyB0YW5eMikgPT0gc2VjKGgpCgogICAgdGFuX2ggPSB0YW4gKChNX1BJLzE4MC4pKihoKSk7CiAgICBzZWNfaCA9IHNxcnQoMSArIHRhbl9oICogdGFuX2gpOwoKICAgIGlmICgoaCA+IDkwKSAmJiAoaCA8IDI3MCkpCiAgICAgICAgICAgIHNlY19oID0gLXNlY19oOwoKICAgIGEgPSBzICogKCBBL2xwTW9kLT5OYmIgKyBOT0lTRV9DT05TVEFOVCkgLyAoIHNlY19oICogNTAwMDAuMCAqIGVzICogbHBNb2QtPk5jICogbHBNb2QtPk5jYi8gMTMuMCArCiAgICAgICAgICAgcyAqICgxMS4wIC8gMjMuMCArICgxMDguMC8yMy4wKSAqIHRhbl9oKSk7CgogICAgYiA9IGEgKiB0YW5faDsKCiAgICAvLyg5KSBDYWxjdWxhdGUgUidhIEcnYSBhbmQgQidhCgogICAgUl9zdWJhX3ByaW1lID0gKDIwLjAvNjEuMCkgKiAoQS9scE1vZC0+TmJiICsgTk9JU0VfQ09OU1RBTlQpICsgKDQxLjAvNjEuMCkgKiAoMTEuMC8yMy4wKSAqIGEgKyAoMjg4LjAvNjEuMCkgLyAyMy4wICogYjsKICAgIEdfc3ViYV9wcmltZSA9ICgyMC4wLzYxLjApICogKEEvbHBNb2QtPk5iYiArIE5PSVNFX0NPTlNUQU5UKSAtICg4MS4wLzYxLjApICogKDExLjAvMjMuMCkgKiBhIC0gKDI2MS4wLzYxLjApIC8gMjMuMCAqIGI7CiAgICBCX3N1YmFfcHJpbWUgPSAoMjAuMC82MS4wKSAqIChBL2xwTW9kLT5OYmIgKyBOT0lTRV9DT05TVEFOVCkgLSAoMjAuMC82MS4wKSAqICgxMS4wLzIzLjApICogYSAtICgyMC4wLzYxLjApICogKDMxNS4wLzIzLjApICogYjsKCiAgICAvLyAoMTApIENhbGN1bGF0ZSBSJywgRycgYW5kIEInCgogICAgaWYgKChSX3N1YmFfcHJpbWUgLSAxKSA8IDApIHsKCiAgICAgICAgIFJfcHJpbWUgPSAtMTAwLjAgKiBwb3coKDIuMCAtIDIuMCAqIFJfc3ViYV9wcmltZSkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDM5LjAgKyBSX3N1YmFfcHJpbWUpLCAxLjAvMC43Myk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgIFJfcHJpbWUgPSAxMDAuMCAqIHBvdygoMi4wICogUl9zdWJhX3ByaW1lIC0gMi4wKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNDEuMCAtIFJfc3ViYV9wcmltZSksIDEuMC8wLjczKTsKICAgIH0KCiAgICBpZiAoKEdfc3ViYV9wcmltZSAtIDEpIDwgMCkKICAgIHsKICAgICAgICAgR19wcmltZSA9IC0xMDAuMCAqIHBvdygoMi4wIC0gMi4wICogR19zdWJhX3ByaW1lKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzkuMCArIEdfc3ViYV9wcmltZSksIDEuMC8wLjczKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAgR19wcmltZSA9IDEwMC4wICogcG93KCgyLjAgKiBHX3N1YmFfcHJpbWUgLSAyLjApIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0MS4wIC0gR19zdWJhX3ByaW1lKSwgMS4wLzAuNzMpOwogICAgfQoKICAgIGlmICgoQl9zdWJhX3ByaW1lIC0gMSkgPCAwKQogICAgewogICAgICAgICBCX3ByaW1lID0gLTEwMC4wICogcG93KCgyLjAgLSAyLjAgKiBCX3N1YmFfcHJpbWUpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzOS4wICsgQl9zdWJhX3ByaW1lKSwgMS4wLzAuNzMpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgICBCX3ByaW1lID0gMTAwLjAgKiBwb3coKDIuMCAqIEJfc3ViYV9wcmltZSAtIDIuMCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQxLjAgLSBCX3N1YmFfcHJpbWUpLCAxLjAvMC43Myk7CiAgICB9CgoKICAgIC8vICgxMSkgQ2FsY3VsYXRlIFJjWSwgR2NZIGFuZCBCY1kKCiAgICBWRUMzaW5pdCgmUkdCX3ByaW1lLCBSX3ByaW1lLCBHX3ByaW1lLCBCX3ByaW1lKTsKICAgIFZFQzNkaXZLKCZ0bXAsICZSR0JfcHJpbWUsIGxwTW9kIC0+IEZsKTsKCiAgICBNQVQzZXZhbCgmUkdCX3N1YmNfWSwgJmxwTW9kLT5NbGFtUmlnZ194X01odW50XzEsICZ0bXApOwoKCgoKI2lmZGVmIFVTRV9DSUVDQU05N3MyCgogICAgICAgLy8gKDEyKQoKCiAgICAgICAgICAgUnZBZGFwdGF0aW9uRGVncmVlKGxwTW9kLCAmUkdCWSwgJlJHQl9zdWJjX1kpOwogICAgICAgICAgIE1BVDNldmFsKCZPdXQsICZscE1vZC0+TWxhbVJpZ2dfMSwgJlJHQlkpOwoKICAgICAgICAgICBvdXRQdHIgLT4gWCA9IE91dC5uWzBdOwogICAgICAgICAgIG91dFB0ciAtPiBZID0gT3V0Lm5bMV07CiAgICAgICAgICAgb3V0UHRyIC0+IFogPSBPdXQublsyXTsKCiNlbHNlCgogICAgICAgICAgIC8vICgxMikgQ2FsY3VsYXRlIFljCgogICAgICAgWV9zdWJjID0gMC40MzIzMSpSR0Jfc3ViY19ZLm5bMF0rMC41MTgzNipSR0Jfc3ViY19ZLm5bMV0rMC4wNDkyOSpSR0Jfc3ViY19ZLm5bMl07CgogICAgICAgICAgIC8vICgxMykgQ2FsY3VsYXRlIChZL1ljKVIsIChZL1ljKUcgYW5kIChZL1ljKUIKCiAgICAgICAgICAgVkVDM2RpdksoJlJHQl9zdWJjX1ksICZSR0Jfc3ViY19ZLCBZX3N1YmMpOwogICAgICAgICAgIFJ2QWRhcHRhdGlvbkRlZ3JlZShscE1vZCwgJllfb3Zlcl9ZX3N1YmNfUkdCLCAmUkdCX3N1YmNfWSk7CgogICAgICAgICAgIC8vICgxNCkgQ2FsY3VsYXRlIFknCiAgICAgICBZX3ByaW1lID0gMC40MzIzMSooWV9vdmVyX1lfc3ViY19SR0IublswXSpZX3N1YmMpICsgMC41MTgzNiooWV9vdmVyX1lfc3ViY19SR0IublsxXSpZX3N1YmMpICsgMC4wNDkyOSAqIChZX292ZXJfWV9zdWJjX1JHQi5uWzJdKllfc3ViYyk7CgogICAgICAgICAgIGlmIChZX3ByaW1lIDwgMCB8fCBZX3N1YmMgPCAwKQogICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgdG8gbmVhciBibGFjayBwb2ludAoKICAgICAgICAgICAgICAgIG91dFB0ciAtPiBYID0gMDsKICAgICAgICAgICAgICAgIG91dFB0ciAtPiBZID0gMDsKICAgICAgICAgICAgICAgIG91dFB0ciAtPiBaID0gMDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9CgogICAgICAgQl90ZXJtID0gcG93KFlfcHJpbWUgLyBZX3N1YmMsICgxLjAgLyBscE1vZC0+cCkgLSAxKTsKCiAgICAgICAgICAvLyAoMTUpIENhbGN1bGF0ZSBYJycsIFknJyBhbmQgWicnCiAgICAgICAgICAgWV9vdmVyX1lfc3ViY19SR0IublsyXSAvPSBCX3Rlcm07CiAgICAgICAgICAgTUFUM2V2YWwoJlhZWl9wcmltZXByaW1lX292ZXJfWV9zdWJjLCAmbHBNb2QtPk1sYW1SaWdnXzEsICZZX292ZXJfWV9zdWJjX1JHQik7CgogICAgICAgICAgIG91dFB0ci0+WCA9ICBYWVpfcHJpbWVwcmltZV9vdmVyX1lfc3ViYy5uWzBdICogWV9zdWJjOwogICAgICAgICAgIG91dFB0ci0+WSA9ICBYWVpfcHJpbWVwcmltZV9vdmVyX1lfc3ViYy5uWzFdICogWV9zdWJjOwogICAgICAgICAgIG91dFB0ci0+WiA9ICBYWVpfcHJpbWVwcmltZV9vdmVyX1lfc3ViYy5uWzJdICogWV9zdWJjOwojZW5kaWYKCn0K