LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogqSAyMDE1IE1pY3JvY2hpcCBUZWNobm9sb2d5IEluYy4gYW5kIGl0cyBzdWJzaWRpYXJpZXMuCiogWW91IG1heSB1c2UgdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGRlcml2YXRpdmVzIGV4Y2x1c2l2ZWx5IHdpdGgKKiBNaWNyb2NoaXAgcHJvZHVjdHMuCiogVEhJUyBTT0ZUV0FSRSBJUyBTVVBQTElFRCBCWSBNSUNST0NISVAgIkFTIElTIi4KKiBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQgT1IgU1RBVFVUT1JZLCBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLAoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwKKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIElUUyBJTlRFUkFDVElPTiBXSVRIIE1JQ1JPQ0hJUAoqIFBST0RVQ1RTLCBDT01CSU5BVElPTiBXSVRIIEFOWSBPVEhFUiBQUk9EVUNUUywgT1IgVVNFIElOIEFOWSBBUFBMSUNBVElPTi4KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsCiogSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIExPU1MsIERBTUFHRSwgQ09TVCBPUiBFWFBFTlNFIE9GIEFOWSBLSU5ECiogV0hBVFNPRVZFUiBSRUxBVEVEIFRPIFRIRSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQsIEVWRU4gSUYgTUlDUk9DSElQIEhBUwoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLgoqIFRPIFRIRSBGVUxMRVNUIEVYVEVOVCBBTExPV0VEIEJZIExBVywgTUlDUk9DSElQJ1MgVE9UQUwgTElBQklMSVRZIE9OIEFMTAoqIENMQUlNUyBJTiBBTlkgV0FZIFJFTEFURUQgVE8gVEhJUyBTT0ZUV0FSRSBXSUxMIE5PVCBFWENFRUQgVEhFIEFNT1VOVCBPRgoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4KKiBNSUNST0NISVAgUFJPVklERVMgVEhJUyBTT0ZUV0FSRSBDT05ESVRJT05BTExZIFVQT04gWU9VUiBBQ0NFUFRBTkNFCiogT0YgVEhFU0UgVEVSTVMuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVmVyc2lvbiBDb250cm9sIEluZm9ybWF0aW9uIChQZXJmb3JjZSkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiRSZXZpc2lvbjogIzEgJCAKJERhdGVUaW1lOiAyMDE2LzA0LzA4IDEwOjE4OjI4ICQgCiRBdXRob3I6IHByYW1hbnMgJApMYXN0IENoYW5nZToJVXBkYXRlZCBmb3IgdGFicwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiBAZmlsZSBwY3JfcGVycGhsLmMKKiBcYnJpZWYgUG93ZXIsIENsb2NrcywgYW5kIFJlc2V0cyBQZXJpcGhlcmFsIFNvdXJjZSBmaWxlCiogXGF1dGhvciBqdmFzYW50aAoqIAoqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBQQ1IgUGVyaXBoZXJhbCBmdW5jdGlvbnMgIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiogQGRlZmdyb3VwIFBDUgogKiAgQHsKICovCgojaW5jbHVkZSAiY29tbW9uX2xpYi5oIgojaW5jbHVkZSAicGNyLmgiCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIEdlbmVyaWMgZnVuY3Rpb25zIHRvIHByb2dyYW0gYW5kIHJlYWQgMzItYml0IHZhbHVlcyBmcm9tIFBDUiBSZWdpc3RlcnMgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiogV3JpdGVzIDMyLWJpdCB2YWx1ZSBpbiB0aGUgUENSIFJlZ2lzdGVyCiAqIEBwYXJhbSBwY3JfcmVnX2lkIC0gcGNyIHJlZ2lzdGVyIGlkIAogKiBAcGFyYW0gdmFsdWUgLSAzMi1iaXQgdmFsdWUKICovCnZvaWQgcF9wY3JfcmVnX3dyaXRlKHVpbnQ4X3QgcGNyX3JlZ19pZCwgdWludDMyX3QgdmFsdWUpCnsKICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOwoKICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKTsJCQoKICAgIHBQQ1JfUmVnICs9IHBjcl9yZWdfaWQ7CgogICAgKnBQQ1JfUmVnID0gdmFsdWU7CQkJCn0KCi8qKiBSZWFkcyAzMi1iaXQgdmFsdWUgZnJvbSB0aGUgUENSIFJlZ2lzdGVyCiAqIEBwYXJhbSBwY3JfcmVnX2lkIC0gcGNyIHJlZ2lzdGVyIGlkIAogKiBAcmV0dXJuIHZhbHVlIC0gMzItYml0IHZhbHVlCiAqLwp1aW50MzJfdCBwX3Bjcl9yZWdfcmVhZCh1aW50OF90IHBjcl9yZWdfaWQpCnsKICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOwogICAgdWludDMyX3QgcmV0VmFsOwoKICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKTsJCQoKICAgIHBQQ1JfUmVnICs9IHBjcl9yZWdfaWQ7CQoKICAgIHJldFZhbCA9ICpwUENSX1JlZzsKCiAgICByZXR1cm4gcmV0VmFsOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgIEZ1bmN0aW9ucyB0byBzZXQsIGNsciBhbmQgZ2V0IGJpdHMgaW4gUENSIFJlZ2lzdGVycyAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqIFNldHMgYml0cyBpbiBhIFBDUiBSZWdpc3RlcgogKiBAcGFyYW0gcGNyX3JlZ19pZCAtIHBjciByZWdpc3RlciBpZCAKICogQHBhcmFtIGJpdF9tYXNrIC0gQml0IG1hc2sgb2YgYml0cyB0byBzZXQgCiAqLwp2b2lkIHBfcGNyX3JlZ19zZXQodWludDhfdCBwY3JfcmVnX2lkLCB1aW50MzJfdCBiaXRfbWFzaykKewogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7CgogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpOwkJCgogICAgcFBDUl9SZWcgKz0gcGNyX3JlZ19pZDsKCiAgICAqcFBDUl9SZWcgfD0gYml0X21hc2s7CQkJCn0KCi8qKiBDbGVhcnMgYml0cyBpbiBhIFBDUiBSZWdpc3RlcgogKiBAcGFyYW0gcGNyX3JlZ19pZCAtIHBjciByZWdpc3RlciBpZCAKICogQHBhcmFtIGJpdF9tYXNrIC0gQml0IG1hc2sgb2YgYml0cyB0byBjbGVhciAKICovCnZvaWQgcF9wY3JfcmVnX2Nscih1aW50OF90IHBjcl9yZWdfaWQsIHVpbnQzMl90IGJpdF9tYXNrKQp7CiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsKCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSk7CQkKCiAgICBwUENSX1JlZyArPSBwY3JfcmVnX2lkOwoKICAgICpwUENSX1JlZyAmPSB+Yml0X21hc2s7CQkJCn0KCi8qKiBSZWFkIGJpdHMgaW4gYSBQQ1IgUmVnaXN0ZXIKICogQHBhcmFtIHBjcl9yZWdfaWQgLSBwY3IgcmVnaXN0ZXIgaWQgCiAqIEBwYXJhbSBiaXRfbWFzayAtIEJpdCBtYXNrIG9mIGJpdHMgdG8gcmVhZCAKICogQHJldHVybiB2YWx1ZSAtIDMyLWJpdCB2YWx1ZQogKi8KdWludDMyX3QgcF9wY3JfcmVnX2dldCh1aW50OF90IHBjcl9yZWdfaWQsIHVpbnQzMl90IGJpdF9tYXNrKQp7CiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsKICAgIHVpbnQzMl90IHJldFZhbDsKCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSk7CQkKCiAgICBwUENSX1JlZyArPSBwY3JfcmVnX2lkOwkJCgogICAgcmV0VmFsID0gKCpwUENSX1JlZykgJiBiaXRfbWFzazsKCiAgICByZXR1cm4gcmV0VmFsOwp9CgovKiogU2V0cyBvciBDbGVhcnMgYml0cyBpbiBhIFBDUiBSZWdpc3RlciAtIEhlbHBlciBGdW5jdGlvbgogKiBAcGFyYW0gcGNyX3JlZ19pZCAtIHBjciByZWdpc3RlciBpZCAKICogQHBhcmFtIGJpdF9tYXNrIC0gQml0IG1hc2sgb2YgYml0cyB0byBzZXQgb3IgY2xlYXIKICogQHBhcmFtIHNldF9jbHJfZmxhZyAtIEZsYWcgdG8gc2V0ICgxKSBvciBjbGVhciAoMCkgYml0cyBpbiB0aGUgUENSIFJlZ2lzdGVyCiAqLwp2b2lkIHBfcGNyX3JlZ191cGRhdGUodWludDhfdCBwY3JfcmVnX2lkLCB1aW50MzJfdCBiaXRfbWFzaywgdWludDhfdCBzZXRfY2xyX2ZsYWcpCnsKICAgIGlmIChzZXRfY2xyX2ZsYWcpCiAgICB7CiAgICAgICAgICAgIHBfcGNyX3JlZ19zZXQocGNyX3JlZ19pZCwgYml0X21hc2spOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgICAgICBwX3Bjcl9yZWdfY2xyKHBjcl9yZWdfaWQsIGJpdF9tYXNrKTsKICAgIH0gICAgICAgIAp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgIEZ1bmN0aW9ucyB0byBvcGVyYXRlIG9uIFN5c3RlbSBTbGVlcCBDb250cm9sIFJlZ2lzdGVyICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqCiAqIFNldHMvQ2xlYXJzIHRoZSBSaW5nIG9zY2lsbGF0b3IgcG93ZXIgZG93biBiaXQgCiAqICAgICAgICAgaW4gU3lzdGVtIFNsZWVwIENvbnRyb2wgUmVnaXN0ZXIKICogQHBhcmFtIHNldF9jbHJfZmxhZyAtIDEgLSBTZXRzIHRoZSBiaXQsIDAgLSBjbGVhcnMgdGhlIGJpdAogKi8Kdm9pZCBwX3Bjcl9zeXN0ZW1fc2xlZXBfY3RybF9yaW5nX29zY19wb3dlcl9kb3duKHVpbnQ4X3Qgc2V0X2Nscl9mbGFnKQp7CglfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsJCQoJCQogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpCSsgUENSX1JFR19TWVNURU1fU0xFRVBfQ1RSTDsKCiAgICBpZiAoc2V0X2Nscl9mbGFnKQogICAgewogICAgICAgICAgICAqcFBDUl9SZWcgfD0gUENSX1NZU19TTFBfQ1RSTF9SSU5HX09TQ19QV1JfRE9XTl9CSVRNQVNLOwkJCQogICAgfQogICAgZWxzZQogICAgewogICAgICAgICpwUENSX1JlZyAmPSB+UENSX1NZU19TTFBfQ1RSTF9SSU5HX09TQ19QV1JfRE9XTl9CSVRNQVNLOwkJCQogICAgfQp9CgovKiogU2V0cy9DbGVhcnMgdGhlIFJpbmcgb3NjaWxsYXRvciBvdXRwdXQgZ2F0ZSBiaXQgCiAqICAgICAgICAgaW4gU3lzdGVtIFNsZWVwIENvbnRyb2wgUmVnaXN0ZXIKICogQHBhcmFtIHNldF9jbHJfZmxhZyAtIDEgLSBTZXRzIHRoZSBiaXQsIDAgLSBjbGVhcnMgdGhlIGJpdAogKi8Kdm9pZCBwX3Bjcl9zeXN0ZW1fc2xlZXBfY3RybF9yaW5nX29zY19vdXRwdXRfZ2F0ZSh1aW50OF90IHNldF9jbHJfZmxhZykKewoJX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7CQkKCQkKICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKQkrIFBDUl9SRUdfU1lTVEVNX1NMRUVQX0NUUkw7CgogICAgaWYgKHNldF9jbHJfZmxhZykKICAgIHsKICAgICAgICAgICAgKnBQQ1JfUmVnIHw9IFBDUl9TWVNfU0xQX0NUUkxfUklOR19PU0NfT1VUUFVUX0dBVEVfQklUTUFTSzsJCQkKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAqcFBDUl9SZWcgJj0gflBDUl9TWVNfU0xQX0NUUkxfUklOR19PU0NfT1VUUFVUX0dBVEVfQklUTUFTSzsJCQkKICAgIH0KfQoKLyoqIFNldHMvQ2xlYXJzIHRoZSBDb3JlIHJlZ3VsYXRvciBzdGFuZGJ5IGJpdCAKICogICAgICAgICBpbiBTeXN0ZW0gU2xlZXAgQ29udHJvbCBSZWdpc3RlcgogKiBAcGFyYW0gc2V0X2Nscl9mbGFnIC0gMSAtIFNldHMgdGhlIGJpdCwgMCAtIGNsZWFycyB0aGUgYml0CiAqLwp2b2lkIHBfcGNyX3N5c3RlbV9zbGVlcF9jdHJsX2NvcmVfcmVndWxhdG9yX3N0ZGJ5KHVpbnQ4X3Qgc2V0X2Nscl9mbGFnKQp7CglfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsJCQoJCQogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpCSsgUENSX1JFR19TWVNURU1fU0xFRVBfQ1RSTDsKCiAgICBpZiAoc2V0X2Nscl9mbGFnKQogICAgewogICAgICAgICAgICAqcFBDUl9SZWcgfD0gUENSX1NZU19TTFBfQ1RSTF9DT1JFX1JFR0xUT1JfU1REQllfQklUTUFTSzsJCQkKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAqcFBDUl9SZWcgJj0gflBDUl9TWVNfU0xQX0NUUkxfQ09SRV9SRUdMVE9SX1NUREJZX0JJVE1BU0s7CQkJCiAgICB9Cn0KCi8qKiBXcml0ZXMgcmVxdWlyZWQgc2xlZXAgbW9kZSBpbiBTeXN0ZW0gU2xlZXAgQ29udHJvbCBSZWdpc3RlcgogKiBAcGFyYW0gc2xlZXBfdmFsdWUgLSBTeXN0ZW0gU2xlZXAgY29udHJvbCB2YWx1ZSAtIFtEMiwgRDEsIEQwXQogKi8Kdm9pZCBwX3Bjcl9zeXN0ZW1fc2xlZXBfY3RybF93cml0ZSh1aW50OF90IHNsZWVwX3ZhbHVlKQp7CiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsJCQogICAgCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkJKyBQQ1JfUkVHX1NZU1RFTV9TTEVFUF9DVFJMOwkKCiAgICAqcFBDUl9SZWcgPSAoc2xlZXBfdmFsdWUgJiAweDcpOwkJCn0KCi8qKiBSZWFkcyB0aGUgU3lzdGVtIFNsZWVwIENvbnRyb2wgUENSIFJlZ2lzdGVyCiAqIEByZXR1cm4gdmFsdWUgLSBieXRlIDAgb2YgdGhlIHN5c3RlbSBzbGVlcCBjb250cm9sIFBDUiByZWdpc3RlcgogKi8KdWludDhfdCBwX3Bjcl9zeXN0ZW1fc2xlZXBfY3RybF9yZWFkKHZvaWQpCnsKICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOwogICAgdWludDhfdCByZXRWYWw7CiAgICAKICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKQkrIFBDUl9SRUdfU1lTVEVNX1NMRUVQX0NUUkw7CQkKCiAgICByZXRWYWwgPSAodWludDhfdCkoKCpwUENSX1JlZykgJiAweEZGKTsKCiAgICByZXR1cm4gcmV0VmFsOwp9CgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgRnVuY3Rpb24gdG8gcHJvZ3JhbSB0byBDTEsgRGl2aWRlIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiogV3JpdGVzIHRoZSBjbG9jayBkaXZpZGUgdmFsdWUgaW4gdGhlIFByb2Nlc3NvciBDbG9jayBDb250cm9sIFJlZ2lzdGVyCiAqIEBwYXJhbSBjbGtfZGl2aWRlX3ZhbHVlIC0gY2xrIGRpdmlkZSB2YWx1ZXMsIHZhbGlkIHZhbHVlcyBpbiBlbnVtIFBST0NFU1NPUl9DTEtfRElWSURFX1ZBTFVFCiAqLwp2b2lkIHBfcGNyX3Byb2Nlc3Nvcl9jbGtfY3RybF93cml0ZSh1aW50OF90IGNsa19kaXZpZGVfdmFsdWUpCnsKICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOwkJCgogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpICsgUENSX1JFR19QUk9DRVNTT1JfQ0xLX0NUUkw7CQkKCiAgICAqcFBDUl9SZWcgPSAoY2xrX2RpdmlkZV92YWx1ZSAmIDB4RkYpOwkKCQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgIEZ1bmN0aW9uIHRvIHByb2dyYW0gdGhlIHNsb3cgY2xvY2sgZGl2aWRlIHZhbHVlICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiogV3JpdGUgdGhlIHNsb3cgY2xvY2sgZGl2aWRlIHZhbHVlIGluIHRoZSBTbG93IENsb2NrIENvbnRyb2wgUmVnaXN0ZXIKICogQHBhcmFtIHNsb3dfY2xrX2RpdmlkZV92YWx1ZSAtIHNsb3cgY2xrIGRpdmlkZSB2YWx1ZQogKi8Kdm9pZCBwX3Bjcl9zbG93X2Nsa19jdHJsX3dyaXRlKHVpbnQ4X3Qgc2xvd19jbGtfZGl2aWRlX3ZhbHVlKQp7CiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsJCQoKICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfU0xPV19DTEtfQ1RSTDsJCQoKICAgICpwUENSX1JlZyA9IChzbG93X2Nsa19kaXZpZGVfdmFsdWUgJiAweDNGRik7CQoKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICBGdW5jdGlvbiB0byByZWFkIHRoZSBPc2NpbGxhdG9yIExvY2sgU3RhdHVzICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qKiBSZWFkcyB0aGUgT3NjaWxsYXRvciBMb2NrIHN0YXR1cyBiaXQgaW4gdGhlIE9zY2lsbGF0b3IgSUQgUmVnaXN0ZXIKICogQHJldHVybiAxIGlmIE9zY2lsbGF0b3IgTG9jayBTdGF0dXMgYml0IGlzIHNldCwgZWxzZSAwCiAqLwp1aW50OF90IHBfcGNyX29zY2lsbGF0b3JfbG9ja19zdHNfZ2V0KHZvaWQpCnsKICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOwogICAgdWludDhfdCByZXRWYWw7CgogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpICsgUENSX1JFR19PU0NJTExBVE9SX0lEOwkKCiAgICByZXRWYWwgPSAwOwogICAgaWYgKCpwUENSX1JlZyAmIFBDUl9PU0NJTExBVE9SX0xPQ0tfU1RBVFVTX0JJVE1BU0spCiAgICB7CiAgICAgICAgICAgIHJldFZhbCA9IDE7CiAgICB9CiAgICAKICAgIHJldHVybiByZXRWYWw7CgkKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgRnVuY3Rpb25zIHRvIHJlYWQgdmFyaW91cyBwb3dlciBzdGF0dXMgaW4gQ2hpcCBTdWItU3lzdGVtIHJlZ2lzdGVyICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qKiBSZWFkcyB0aGUgVkNDIFJlc2V0IFN0YXR1cyBiaXQgCiAqICAgICAgICBpbiB0aGUgQ2hpcCBTdWJzeXN0ZW0gUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyCiAqIEByZXR1cm4gMSBpZiBWQ0MgUmVzZXQgU3RhdHVzIGJpdCBpcyBzZXQsIGVsc2UgMAogKi8KdWludDhfdCBwX3Bjcl9jaGlwX3N1YnN5c3RlbV92Y2NfcmVzZXRfc3RzX2dldCh2b2lkKQp7CiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsKICAgIHVpbnQ4X3QgcmV0VmFsOwoKICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfQ0hJUF9TVUJTWVNURU1fUFdSX1JFU0VUX1NUUzsJCgogICAgcmV0VmFsID0gMDsKICAgIGlmICgqcFBDUl9SZWcgJiBQQ1JfQ0hJUF9TVUJTWVNURU1fVkNDX1JFU0VUX1NUU19CSVRNQVNLKQogICAgewogICAgICAgICAgICByZXRWYWwgPSAxOwogICAgfQogICAgCiAgICByZXR1cm4gcmV0VmFsOwkKfQoKLyoqIFJlYWRzIHRoZSBTSU8gUmVzZXQgU3RhdHVzIGJpdCAKICogICAgICAgIGluIHRoZSBDaGlwIFN1YnN5c3RlbSBQb3dlciBSZXNldCBTdGF0dXMgUmVnaXN0ZXIKICogQHJldHVybiAxIGlmIFNJTyBSZXNldCBTdGF0dXMgYml0IGlzIHNldCwgZWxzZSAwCiAqLwp1aW50OF90IHBfcGNyX2NoaXBfc3Vic3lzdGVtX3Npb19yZXNldF9zdHNfZ2V0KHZvaWQpCnsKICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOwogICAgdWludDhfdCByZXRWYWw7CgogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpICsgUENSX1JFR19DSElQX1NVQlNZU1RFTV9QV1JfUkVTRVRfU1RTOwkKCiAgICByZXRWYWwgPSAwOwogICAgaWYgKCpwUENSX1JlZyAmIFBDUl9DSElQX1NVQlNZU1RFTV9TSU9fUkVTRVRfU1RTX0JJVE1BU0spCiAgICB7CiAgICAgICAgICAgIHJldFZhbCA9IDE7CiAgICB9CiAgICAKICAgIHJldHVybiByZXRWYWw7CQp9CgovKiogUmVhZHMgdGhlIFZCQVQgUmVzZXQgU3RhdHVzIGJpdCAKICogICAgICAgIGluIHRoZSBDaGlwIFN1YnN5c3RlbSBQb3dlciBSZXNldCBTdGF0dXMgUmVnaXN0ZXIKICogQHJldHVybiAxIGlmIFZCQVQgUmVzZXQgU3RhdHVzIGJpdCBpcyBzZXQsIGVsc2UgMAogKi8KdWludDhfdCBwX3Bjcl9jaGlwX3N1YnN5c3RlbV92YmF0X3Jlc2V0X3N0c19nZXQodm9pZCkKewogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7CiAgICB1aW50OF90IHJldFZhbDsKCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX0NISVBfU1VCU1lTVEVNX1BXUl9SRVNFVF9TVFM7CQoKICAgIHJldFZhbCA9IDA7CiAgICBpZiAoKnBQQ1JfUmVnICYgUENSX0NISVBfU1VCU1lTVEVNX1ZCQVRfUkVTRVRfU1RTX0JJVE1BU0spCiAgICB7CiAgICAgICAgICAgIHJldFZhbCA9IDE7CiAgICB9CiAgICAKICAgIHJldHVybiByZXRWYWw7CQp9CgovKiogQ2xlYXJzIHRoZSBWQkFUIFJlc2V0IFN0YXR1cyBiaXQgCiAqICAgICAgICBpbiB0aGUgQ2hpcCBTdWJzeXN0ZW0gUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyIAogKi8Kdm9pZCBwX3Bjcl9jaGlwX3N1YnN5c3RlbV92YmF0X3Jlc2V0X3N0c19jbHIodm9pZCkKewogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7CQkKCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX0NISVBfU1VCU1lTVEVNX1BXUl9SRVNFVF9TVFM7CgogICAgLy8gV3JpdGUgdG8gY2xlYXIKICAgICpwUENSX1JlZyA9IFBDUl9DSElQX1NVQlNZU1RFTV9WQkFUX1JFU0VUX1NUU19CSVRNQVNLOwoJCn0KCi8qKiBSZWFkcyB0aGUgVkNDMSBSZXNldCBTdGF0dXMgYml0IAogKiAgICAgICAgaW4gdGhlIENoaXAgU3Vic3lzdGVtIFBvd2VyIFJlc2V0IFN0YXR1cyBSZWdpc3RlcgogKiBAcmV0dXJuIDEgaWYgVkNDMSBSZXNldCBTdGF0dXMgYml0IGlzIHNldCwgZWxzZSAwCiAqLwp1aW50OF90IHBfcGNyX2NoaXBfc3Vic3lzdGVtX3ZjYzFfcmVzZXRfc3RzX2dldCh2b2lkKQp7CiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsKICAgIHVpbnQ4X3QgcmV0VmFsOwoKICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfQ0hJUF9TVUJTWVNURU1fUFdSX1JFU0VUX1NUUzsJCgogICAgcmV0VmFsID0gMDsKICAgIGlmICgqcFBDUl9SZWcgJiBQQ1JfQ0hJUF9TVUJTWVNURU1fVkNDMV9SRVNFVF9TVFNfQklUTUFTSykKICAgIHsKICAgICAgICAgICAgcmV0VmFsID0gMTsKICAgIH0KICAgIAogICAgcmV0dXJuIHJldFZhbDsJCn0KCi8qKiBDbGVhcnMgdGhlIFZDQzEgUmVzZXQgU3RhdHVzIGJpdCAKICogICAgICAgIGluIHRoZSBDaGlwIFN1YnN5c3RlbSBQb3dlciBSZXNldCBTdGF0dXMgUmVnaXN0ZXIgCiAqLwp2b2lkIHBfcGNyX2NoaXBfc3Vic3lzdGVtX3ZjYzFfcmVzZXRfc3RzX2Nscih2b2lkKQp7CiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsJCQoKICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfQ0hJUF9TVUJTWVNURU1fUFdSX1JFU0VUX1NUUzsKCiAgICAvLyBXcml0ZSB0byBjbGVhcgogICAgKnBQQ1JfUmVnID0gUENSX0NISVBfU1VCU1lTVEVNX1ZDQzFfUkVTRVRfU1RTX0JJVE1BU0s7CgkKfQoKLyoqIFJlYWRzIHRoZSAzMktfQUNUSVZFIHN0YXR1cyBiaXQgCiAqICAgICAgICBpbiB0aGUgQ2hpcCBTdWJzeXN0ZW0gUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyCiAqIEByZXR1cm4gMSBpZiAzMl9BQ1RJVkUgYml0IGlzIHNldCwgZWxzZSAwCiAqLwp1aW50OF90IHBfcGNyX2NoaXBfc3Vic3lzdGVtXzMyS19hY3RpdmVfc3RzX2dldCh2b2lkKQp7CiAgICBfX0lPIHVpbnQzMl90ICpwUENSX1JlZzsKICAgIHVpbnQ4X3QgcmV0VmFsOwoKICAgIHBQQ1JfUmVnID0gKHVpbnQzMl90ICopKFBDUl9CQVNFKSArIFBDUl9SRUdfQ0hJUF9TVUJTWVNURU1fUFdSX1JFU0VUX1NUUzsJCgogICAgcmV0VmFsID0gMDsKICAgIGlmICgqcFBDUl9SZWcgJiBQQ1JfQ0hJUF9TVUJTWVNURU1fMzJLX0FDVElWRV9TVFNfQklUTUFTSykKICAgIHsKICAgICAgICAgICAgcmV0VmFsID0gMTsKICAgIH0KICAgIAogICAgcmV0dXJuIHJldFZhbDsJCn0KCi8qKiBSZWFkcyB0aGUgUENJQ0xLX0FDVElWRSBzdGF0dXMgYml0IAogKiAgICAgICAgaW4gdGhlIENoaXAgU3Vic3lzdGVtIFBvd2VyIFJlc2V0IFN0YXR1cyBSZWdpc3RlcgogKiBAcmV0dXJuIDEgaWYgQ0lDTEtfQUNUSVZFIGJpdCBpcyBzZXQsIGVsc2UgMAogKi8KdWludDhfdCBwX3Bjcl9jaGlwX3N1YnN5c3RlbV9wY2ljbGtfYWN0aXZlX3N0c19nZXQodm9pZCkKewogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7CiAgICB1aW50OF90IHJldFZhbDsKCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX0NISVBfU1VCU1lTVEVNX1BXUl9SRVNFVF9TVFM7CQoKICAgIHJldFZhbCA9IDA7CiAgICBpZiAoKnBQQ1JfUmVnICYgUENSX0NISVBfU1VCU1lTVEVNX1BDSUNMS19BQ1RJVkVfU1RTX0JJVE1BU0spCiAgICB7CiAgICAgICAgICAgIHJldFZhbCA9IDE7CiAgICB9CQkKICAgIHJldHVybiByZXRWYWw7CQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICBGdW5jdGlvbnMgZm9yIFBvd2VyIFJlc2V0IENvbnRyb2wgUmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqIFJlYWRzIHRoZSBpUkVTRVRfT1VUIGJpdCBpbiB0aGUgUG93ZXIgUmVzZXQgQ29udHJvbCBSZWdpc3RlcgogKiBAcmV0dXJuIDEgaWYgaVJFU0VUX09VVCBiaXQgaXMgc2V0LCBlbHNlIDAKICovCnVpbnQ4X3QgcF9wY3JfaVJlc2V0X091dF9nZXQodm9pZCkKewogICAgX19JTyB1aW50MzJfdCAqcFBDUl9SZWc7CiAgICB1aW50OF90IHJldFZhbDsKCiAgICBwUENSX1JlZyA9ICh1aW50MzJfdCAqKShQQ1JfQkFTRSkgKyBQQ1JfUkVHX1BXUl9SRVNFVF9DVFJMOwkKCiAgICByZXRWYWwgPSAwOwogICAgaWYgKCpwUENSX1JlZyAmIFBDUl9pUkVTRVRfT1VUX0JJVE1BU0spCiAgICB7CiAgICAgICAgICAgIHJldFZhbCA9IDE7CiAgICB9CiAgICAKICAgIHJldHVybiByZXRWYWw7CgkKfQoKLyoqIFNldHMvQ2xlYXJzIHRoZSBpUkVTRVRfT1VUIGJpdCBpbiB0aGUgUG93ZXIgUmVzZXQgQ29udHJvbCBSZWdpc3RlcgogKiBAcGFyYW0gMSBTZXQgaVJFU0VUX09VVCBiaXQ7IDAgLSBDbGVhciB0aGUgYml0CiAqLwp2b2lkIHBfcGNyX2lSZXNldF9PdXQodWludDhfdCBzZXRfY2xyX2ZsYWcpCnsKICAgIF9fSU8gdWludDMyX3QgKnBQQ1JfUmVnOwkJCgogICAgcFBDUl9SZWcgPSAodWludDMyX3QgKikoUENSX0JBU0UpICsgUENSX1JFR19QV1JfUkVTRVRfQ1RSTDsKCiAgICAqcFBDUl9SZWcJID0gKHNldF9jbHJfZmxhZyAmIDB4MSk7CQkKfQoKCi8qIGVuZCBwY3JfcGVycGhsLmMgKi8KLyoqICAgQH0KICovCg==