LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogqSAyMDE1IE1pY3JvY2hpcCBUZWNobm9sb2d5IEluYy4gYW5kIGl0cyBzdWJzaWRpYXJpZXMuCiogWW91IG1heSB1c2UgdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGRlcml2YXRpdmVzIGV4Y2x1c2l2ZWx5IHdpdGgKKiBNaWNyb2NoaXAgcHJvZHVjdHMuCiogVEhJUyBTT0ZUV0FSRSBJUyBTVVBQTElFRCBCWSBNSUNST0NISVAgIkFTIElTIi4KKiBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQgT1IgU1RBVFVUT1JZLCBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLAoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwKKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIElUUyBJTlRFUkFDVElPTiBXSVRIIE1JQ1JPQ0hJUAoqIFBST0RVQ1RTLCBDT01CSU5BVElPTiBXSVRIIEFOWSBPVEhFUiBQUk9EVUNUUywgT1IgVVNFIElOIEFOWSBBUFBMSUNBVElPTi4KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsCiogSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIExPU1MsIERBTUFHRSwgQ09TVCBPUiBFWFBFTlNFIE9GIEFOWSBLSU5ECiogV0hBVFNPRVZFUiBSRUxBVEVEIFRPIFRIRSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQsIEVWRU4gSUYgTUlDUk9DSElQIEhBUwoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLgoqIFRPIFRIRSBGVUxMRVNUIEVYVEVOVCBBTExPV0VEIEJZIExBVywgTUlDUk9DSElQJ1MgVE9UQUwgTElBQklMSVRZIE9OIEFMTAoqIENMQUlNUyBJTiBBTlkgV0FZIFJFTEFURUQgVE8gVEhJUyBTT0ZUV0FSRSBXSUxMIE5PVCBFWENFRUQgVEhFIEFNT1VOVCBPRgoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4KKiBNSUNST0NISVAgUFJPVklERVMgVEhJUyBTT0ZUV0FSRSBDT05ESVRJT05BTExZIFVQT04gWU9VUiBBQ0NFUFRBTkNFCiogT0YgVEhFU0UgVEVSTVMuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVmVyc2lvbiBDb250cm9sIEluZm9ybWF0aW9uIChQZXJmb3JjZSkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiRSZXZpc2lvbjogIzEgJCAKJERhdGVUaW1lOiAyMDE2LzA0LzA4IDEwOjE4OjI4ICQgCiRBdXRob3I6IHByYW1hbnMgJApMYXN0IENoYW5nZToJVXBkYXRlZCBmb3IgdGFicwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiBAZmlsZSBwY3IuaAoqIFxicmllZiBQb3dlciwgQ2xvY2tzLCBhbmQgUmVzZXRzIEhlYWRlciBmaWxlCiogXGF1dGhvciBqdmFzYW50aAoqIAoqIFRoaXMgZmlsZSBpcyB0aGUgUENSIGhlYWRlciBmaWxlICAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqIEBkZWZncm91cCBQQ1IKICogIEB7CiAqLwoKI2lmbmRlZiBfUENSX0gKI2RlZmluZSBfUENSX0gKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiogIFBDUiBSZWdpc3RlciBJRFMgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwplbnVtIF9QQ1JfUkVHU0VUX0lEXwp7CglQQ1JfUkVHX0NISVBfU0xFRVBfRU5BQkxFID0wLAoJUENSX1JFR19DSElQX0NMS19SRVFEX1NUUywKCVBDUl9SRUdfRUNfU0xFRVBfRU5BQkxFLAoJUENSX1JFR19FQ19DTEtfUkVRRF9TVFMsCglQQ1JfUkVHX0hPU1RfU0xFRVBfRU5BQkxFLAoJUENSX1JFR19IT1NUX0NMS19SRVFEX1NUUywKCVBDUl9SRUdfU1lTVEVNX1NMRUVQX0NUUkwsCQoJUENSX1JFR19QUk9DRVNTT1JfQ0xLX0NUUkwgPSA4LAoJUENSX1JFR19FQ19TTEVFUF9FTkFCTEVfMiwKCVBDUl9SRUdfRUNfQ0xLX1JFUURfU1RTXzIsCglQQ1JfUkVHX1NMT1dfQ0xLX0NUUkwsCglQQ1JfUkVHX09TQ0lMTEFUT1JfSUQsCglQQ1JfUkVHX0NISVBfU1VCU1lTVEVNX1BXUl9SRVNFVF9TVFMsCglQQ1JfUkVHX0NISVBfUkVTRVRfRU5BQkxFLAoJUENSX1JFR19IT1NUX1JFU0VUX0VOQUJMRSwKCVBDUl9SRUdfRUNfUkVTRVRfRU5BQkxFLAoJUENSX1JFR19FQ19SRVNFVF9FTkFCTEVfMiwKCVBDUl9SRUdfUFdSX1JFU0VUX0NUUkwKfTsKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLy8gRW5jb2RlIHRoZSBSZWdpc3RlciBpZHMgZm9yIFNsZWVwIEVuYWJsZSwgQ2xvY2sgUmVxdWlyZWQsIFJlc2V0IEVuYWJsZQovL1BDUiByZWdpc3RlciBncm91cCAwIC0gQ0hJUAojZGVmaW5lIFBDUjBfUkVHU19DSElQCQkoKCh1aW50MzJfdCkoUENSX1JFR19DSElQX1NMRUVQX0VOQUJMRSkgJiAweEZGKSArIFwKCQkJCQkJCSgoKHVpbnQzMl90KShQQ1JfUkVHX0NISVBfQ0xLX1JFUURfU1RTKSAmIDB4RkYpPDw4dSkgKyBcCgkJCQkJCQkoKCh1aW50MzJfdCkoUENSX1JFR19DSElQX1JFU0VUX0VOQUJMRSkgJiAweEZGKTw8MTZ1KSkKCi8vUENSIHJlZ2lzdGVyIGdyb3VwIDEgLSBFQwojZGVmaW5lIFBDUjFfUkVHU19FQwkJKCgodWludDMyX3QpKFBDUl9SRUdfRUNfU0xFRVBfRU5BQkxFKSAmIDB4RkYpICsgXAoJCQkJCQkJKCgodWludDMyX3QpKFBDUl9SRUdfRUNfQ0xLX1JFUURfU1RTKSAmIDB4RkYpPDw4dSkgKyBcCgkJCQkJCQkoKCh1aW50MzJfdCkoUENSX1JFR19FQ19SRVNFVF9FTkFCTEUpICYgMHhGRik8PDE2dSkpCgovL1BDUiByZWdpc3RlciBncm91cCAyIC0gSE9TVAojZGVmaW5lIFBDUjJfUkVHU19IT1NUCQkoKCh1aW50MzJfdCkoUENSX1JFR19FQ19TTEVFUF9FTkFCTEUpICYgMHhGRikgKyBcCgkJCQkJCQkoKCh1aW50MzJfdCkoUENSX1JFR19FQ19DTEtfUkVRRF9TVFMpICYgMHhGRik8PDh1KSArIFwKCQkJCQkJCSgoKHVpbnQzMl90KShQQ1JfUkVHX0VDX1JFU0VUX0VOQUJMRSkgJiAweEZGKTw8MTZ1KSkKCi8vUENSIHJlZ2lzdGVyIGdyb3VwIDMgLSBFQyAyCiNkZWZpbmUgUENSM19SRUdTX0VDMgkJKCgodWludDMyX3QpKFBDUl9SRUdfRUNfU0xFRVBfRU5BQkxFXzIpICYgMHhGRikgKyBcCgkJCQkJCQkoKCh1aW50MzJfdCkoUENSX1JFR19FQ19DTEtfUkVRRF9TVFNfMikgJiAweEZGKTw8OHUpICsgXAoJCQkJCQkJKCgodWludDMyX3QpKFBDUl9SRUdfRUNfUkVTRVRfRU5BQkxFXzIpICYgMHhGRik8PDE2dSkpCgkJCQkJCQkJCQkJCQkKCQkJCQkJCQkJCQkJCi8vUENSMV9FQyAtPiBTTEVFUF9FTkFCTEUsIENMSyBSRVFEIFNUUywgUkVTRVRfRU5BQkxFIEJpdCBQb3NpdGlvbnMKI2RlZmluZSBQQ1IxX0VDX0lOVF9CSVRQT1MgICAgICAgICAgICgwdSkKI2RlZmluZSBQQ1IxX0VDX1BFQ0lfQklUUE9TICAgICAgICAgICgxdSkKI2RlZmluZSBQQ1IxX0VDX1RBQ0gwX0JJVFBPUyAgICAgICAgICgydSkKI2RlZmluZSBQQ1IxX0VDX1BXTTBfQklUUE9TICAgICAgICAgICg0dSkKI2RlZmluZSBQQ1IxX0VDX1BNQ19CSVRQT1MgICAgICAgICAgICg1dSkKI2RlZmluZSBQQ1IxX0VDX0RNQV9CSVRQT1MgICAgICAgICAgICg2dSkKI2RlZmluZSBQQ1IxX0VDX1RGRFBfQklUUE9TICAgICAgICAgICg3dSkKI2RlZmluZSBQQ1IxX0VDX0NQVV9CSVRQT1MgICAgICAgICAgICg4dSkKI2RlZmluZSBQQ1IxX0VDX1dEVF9CSVRQT1MgICAgICAgICAgICg5dSkKI2RlZmluZSBQQ1IxX0VDX1NNQjBfQklUUE9TICAgICAgICAgICgxMHUpCiNkZWZpbmUgUENSMV9FQ19UQUNIMV9CSVRQT1MgICAgICAgICAoMTF1KQojZGVmaW5lIFBDUjFfRUNfUFdNMV9CSVRQT1MgICAgICAgICAgKDIwdSkKI2RlZmluZSBQQ1IxX0VDX1BXTTJfQklUUE9TICAgICAgICAgICgyMXUpCiNkZWZpbmUgUENSMV9FQ19QV00zX0JJVFBPUyAgICAgICAgICAoMjJ1KQojZGVmaW5lIFBDUjFfRUNfUkVHX0JJVFBPUyAgICAgICAgICAgKDI5dSkKI2RlZmluZSBQQ1IxX0VDX0JUSU1FUjBfQklUUE9TICAgICAgICgzMHUpCiNkZWZpbmUgUENSMV9FQ19CVElNRVIxX0JJVFBPUyAgICAgICAoMzF1KQoKLy9QQ1IyX0hPU1QgLT4gU0xFRVBfRU5BQkxFLCBDTEsgUkVRRCBTVFMsIFJFU0VUX0VOQUJMRSBCaXQgUG9zaXRpb25zCiNkZWZpbmUgUENSMl9IT1NUX0xQQ19CSVRQT1MgICAgICAJCSAgKDB1KQojZGVmaW5lIFBDUjJfSE9TVF9VQVJUMF9CSVRQT1MgICAgCQkgICgxdSkKI2RlZmluZSBQQ1IyX0hPU1RfR0xCTF9DRkdfQklUUE9TIAkJICAoMTJ1KQojZGVmaW5lIFBDUjJfSE9TVF9BQ1BJX0VDMF9CSVRQT1MgCQkgICgxM3UpCiNkZWZpbmUgUENSMl9IT1NUX0FDUElfRUMxX0JJVFBPUyAJCSAgKDE0dSkKI2RlZmluZSBQQ1IyX0hPU1RfQUNQSV9QTTFfQklUUE9TIAkJICAoMTV1KQojZGVmaW5lIFBDUjJfSE9TVF84MDQyRU1fQklUUE9TCSAgCQkgICgxNnUpCiNkZWZpbmUgUENSMl9IT1NUX1JUQ19CSVRQT1MgICAgICAJCSAgKDE4dSkKCi8vUENSM19FQzIgLT4gU0xFRVBfRU5BQkxFLCBDTEsgUkVRRCBTVFMsIFJFU0VUX0VOQUJMRSBCaXQgUG9zaXRpb25zCiNkZWZpbmUgUENSM19FQzJfQURDX0JJVFBPUyAgICAgIAkJICAgKDN1KQojZGVmaW5lIFBDUjNfRUMyX1BTMl8wX0JJVFBPUyAgICAJCSAgICg1dSkKI2RlZmluZSBQQ1IzX0VDMl9QUzJfMV9CSVRQT1MgICAgCQkgICAoNnUpCiNkZWZpbmUgUENSM19FQzJfUFMyXzJfQklUUE9TICAgIAkJICAgKDd1KQojZGVmaW5lIFBDUjNfRUMyX1BTMl8zX0JJVFBPUyAgICAJCSAgICg4dSkKI2RlZmluZSBQQ1IzX0VDMl9TUEkwX0JJVFBPUyAgICAgCQkgICAoOXUpCiNkZWZpbmUgUENSM19FQzJfSFRJTUVSX0JJVFBPUyAgIAkJICAgKDEwdSkKI2RlZmluZSBQQ1IzX0VDMl9LRVlTQ0FOX0JJVFBPUyAgCQkgICAoMTF1KQojZGVmaW5lIFBDUjNfRUMyX1JQTV9QV01fQklUUE9TICAJCSAgICgxMnUpCiNkZWZpbmUgUENSM19FQzJfU01CMV9CSVRQT1MgICAgIAkJICAgKDEzdSkKI2RlZmluZSBQQ1IzX0VDMl9TTUIyX0JJVFBPUyAgICAgCQkgICAoMTR1KQojZGVmaW5lIFBDUjNfRUMyX1NNQjNfQklUUE9TICAgICAJCSAgICgxNXUpCiNkZWZpbmUgUENSM19FQzJfTEVEMF9CSVRQT1MgICAgIAkJICAgKDE2dSkKI2RlZmluZSBQQ1IzX0VDMl9MRUQxX0JJVFBPUyAgICAgCQkgICAoMTd1KQojZGVmaW5lIFBDUjNfRUMyX0xFRDJfQklUUE9TICAgICAJCSAgICgxOHUpCiNkZWZpbmUgUENSM19FQzJfQkNNX0JJVFBPUyAgICAgIAkJICAgKDE5dSkKI2RlZmluZSBQQ1IzX0VDMl9TUEkxX0JJVFBPUyAgICAgCQkgICAoMjB1KQojZGVmaW5lIFBDUjNfRUMyX0JUSU1FUjJfQklUUE9TICAJCSAgICgyMXUpCiNkZWZpbmUgUENSM19FQzJfQlRJTUVSM19CSVRQT1MgIAkJICAgKDIydSkKI2RlZmluZSBQQ1IzX0VDMl9CVElNRVI0X0JJVFBPUyAgCQkgICAoMjN1KQojZGVmaW5lIFBDUjNfRUMyX0JUSU1FUjVfQklUUE9TICAJCSAgICgyNHUpCiNkZWZpbmUgUENSM19FQzJfTEVEM19CSVRQT1MgICAgIAkJICAgKDI1dSkKCi8qCiAqICBuID0gYls3OjBdICAgPSBQQ1IgUmVnIEJpdCBQb3NpdGlvbgogKiAgbSA9IGJbMzE6OF0gID0gUENSeCBSZWdzIElEcwogKi8KLy8jZGVmaW5lIFBDUnhfUkVHU19CSVQobSxuKSAoKCgodWludDMyX3QpKG0pJjB4RkZGRkZGdWwpPDw4dSkgKyAoKHVpbnQzMl90KShuKSYweEZGdWwpKSAKCi8vUENSeF9SRUdTX0JJVCBwb3NpdGlvbnMgCQkJCQkJCQkJCQkJCQojZGVmaW5lCVBDUnhfUkVHU19QT1NfU0xFRVBfRU5BQkxFCQkJCSg4dSkKI2RlZmluZQlQQ1J4X1JFR1NfUE9TX0NMS19SRVFEX1NUUwkJCQkoMTZ1KQojZGVmaW5lCVBDUnhfUkVHU19QT1NfUkVTRVRfRU5BQkxFCQkJCSgyNHUpCQkJCQkJCQkJCQkJCQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiAgUENSIEJsb2NrIElEUy4gCiAqIFRoZXNlIElEcyBhcmUgdXNlZCB0byBkaXJlY3RseSByZWZlciB0byBhIGJsb2NrIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBlbnVtIHsKCVBDUl9JTlQJCQkJPSAoKCh1aW50MzJfdCkoUENSMV9SRUdTX0VDKSA8PCA4KSArICh1aW50MzJfdCkoUENSMV9FQ19JTlRfQklUUE9TICYgMHhGRnUpKSwgIAkKCVBDUl9QRUNJCQkJPSAoKCh1aW50MzJfdCkoUENSMV9SRUdTX0VDKSA8PCA4KSArICh1aW50MzJfdCkoUENSMV9FQ19QRUNJX0JJVFBPUyAmIDB4RkZ1KSksIAkKCVBDUl9UQUNIMAkJCT0gKCgodWludDMyX3QpKFBDUjFfUkVHU19FQykgPDwgOCkgKyAodWludDMyX3QpKFBDUjFfRUNfVEFDSDBfQklUUE9TICYgMHhGRnUpKSwgCQoJUENSX1BXTTAJCQk9ICgoKHVpbnQzMl90KShQQ1IxX1JFR1NfRUMpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IxX0VDX1BXTTBfQklUUE9TICYgMHhGRnUpKSwgIAkKCVBDUl9QTUMJCQkJPSAoKCh1aW50MzJfdCkoUENSMV9SRUdTX0VDKSA8PCA4KSArICh1aW50MzJfdCkoUENSMV9FQ19QTUNfQklUUE9TICYgMHhGRnUpKSwgICAJCglQQ1JfRE1BCQkJCT0gKCgodWludDMyX3QpKFBDUjFfUkVHU19FQykgPDwgOCkgKyAodWludDMyX3QpKFBDUjFfRUNfRE1BX0JJVFBPUyAmIDB4RkZ1KSksICAJCglQQ1JfVEZEUAkJCT0gKCgodWludDMyX3QpKFBDUjFfUkVHU19FQykgPDwgOCkgKyAodWludDMyX3QpKFBDUjFfRUNfVEZEUF9CSVRQT1MgJiAweEZGdSkpLCAgCQoJUENSX0NQVQkJCQk9ICgoKHVpbnQzMl90KShQQ1IxX1JFR1NfRUMpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IxX0VDX0NQVV9CSVRQT1MgJiAweEZGdSkpLCAgIAkKCVBDUl9XRFQJCQkJPSAoKCh1aW50MzJfdCkoUENSMV9SRUdTX0VDKSA8PCA4KSArICh1aW50MzJfdCkoUENSMV9FQ19XRFRfQklUUE9TICYgMHhGRnUpKSwgICAJCglQQ1JfU01CMAkJCT0gKCgodWludDMyX3QpKFBDUjFfUkVHU19FQykgPDwgOCkgKyAodWludDMyX3QpKFBDUjFfRUNfU01CMF9CSVRQT1MgJiAweEZGdSkpLCAJCglQQ1JfVEFDSDEJCQk9ICgoKHVpbnQzMl90KShQQ1IxX1JFR1NfRUMpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IxX0VDX1RBQ0gxX0JJVFBPUyAmIDB4RkZ1KSksIAkKCVBDUl9QV00xCQkJPSAoKCh1aW50MzJfdCkoUENSMV9SRUdTX0VDKSA8PCA4KSArICh1aW50MzJfdCkoUENSMV9FQ19QV00xX0JJVFBPUyAmIDB4RkZ1KSksICAJCglQQ1JfUFdNMgkJCT0gKCgodWludDMyX3QpKFBDUjFfUkVHU19FQykgPDwgOCkgKyAodWludDMyX3QpKFBDUjFfRUNfUFdNMl9CSVRQT1MgJiAweEZGdSkpLCAgCQoJUENSX1BXTTMJCQk9ICgoKHVpbnQzMl90KShQQ1IxX1JFR1NfRUMpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IxX0VDX1BXTTNfQklUUE9TICYgMHhGRnUpKSwgIAkKCVBDUl9SRUcJCQkJPSAoKCh1aW50MzJfdCkoUENSMV9SRUdTX0VDKSA8PCA4KSArICh1aW50MzJfdCkoUENSMV9FQ19SRUdfQklUUE9TICYgMHhGRnUpKSwgICAJCglQQ1JfQlRJTUVSMAkJCT0gKCgodWludDMyX3QpKFBDUjFfUkVHU19FQykgPDwgOCkgKyAodWludDMyX3QpKFBDUjFfRUNfQlRJTUVSMF9CSVRQT1MgJiAweEZGdSkpLAkKCVBDUl9CVElNRVIxCQkJPSAoKCh1aW50MzJfdCkoUENSMV9SRUdTX0VDKSA8PCA4KSArICh1aW50MzJfdCkoUENSMV9FQ19CVElNRVIxX0JJVFBPUyAmIDB4RkZ1KSksCQoJUENSX0xQQwkJCQk9ICgoKHVpbnQzMl90KShQQ1IyX1JFR1NfSE9TVCkgPDwgOCkgKyAodWludDMyX3QpKFBDUjJfSE9TVF9MUENfQklUUE9TICYgMHhGRnUpKSwKCVBDUl9VQVJUMAkJCT0gKCgodWludDMyX3QpKFBDUjJfUkVHU19IT1NUKSA8PCA4KSArICh1aW50MzJfdCkoUENSMl9IT1NUX1VBUlQwX0JJVFBPUyAmIDB4RkZ1KSksCglQQ1JfR0xCTF9DRkcJCT0gKCgodWludDMyX3QpKFBDUjJfUkVHU19IT1NUKSA8PCA4KSArICh1aW50MzJfdCkoUENSMl9IT1NUX0dMQkxfQ0ZHX0JJVFBPUyAmIDB4RkZ1KSksCglQQ1JfQUNQSV9FQzAJCT0gKCgodWludDMyX3QpKFBDUjJfUkVHU19IT1NUKSA8PCA4KSArICh1aW50MzJfdCkoUENSMl9IT1NUX0FDUElfRUMwX0JJVFBPUyAmIDB4RkZ1KSksCglQQ1JfQUNQSV9FQzEJCT0gKCgodWludDMyX3QpKFBDUjJfUkVHU19IT1NUKSA8PCA4KSArICh1aW50MzJfdCkoUENSMl9IT1NUX0FDUElfRUMxX0JJVFBPUyAmIDB4RkZ1KSksCglQQ1JfQUNQSV9QTTEJCT0gKCgodWludDMyX3QpKFBDUjJfUkVHU19IT1NUKSA8PCA4KSArICh1aW50MzJfdCkoUENSMl9IT1NUX0FDUElfUE0xX0JJVFBPUyAmIDB4RkZ1KSksCglQQ1JfODA0MkVNCQkJPSAoKCh1aW50MzJfdCkoUENSMl9SRUdTX0hPU1QpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IyX0hPU1RfODA0MkVNX0JJVFBPUyAmIDB4RkZ1KSksCglQQ1JfUlRDCQkJCT0gKCgodWludDMyX3QpKFBDUjJfUkVHU19IT1NUKSA8PCA4KSArICh1aW50MzJfdCkoUENSMl9IT1NUX1JUQ19CSVRQT1MgJiAweEZGdSkpLAoJUENSX0FEQwkJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfQURDX0JJVFBPUyAmIDB4RkZ1KSksCglQQ1JfUFMyXzAJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfUFMyXzBfQklUUE9TICYgMHhGRnUpKSwgICAgCQoJUENSX1BTMl8xCQkJPSAoKCh1aW50MzJfdCkoUENSM19SRUdTX0VDMikgPDwgOCkgKyAodWludDMyX3QpKFBDUjNfRUMyX1BTMl8xX0JJVFBPUyAmIDB4RkZ1KSksICAgIAkKCVBDUl9QUzJfMgkJCT0gKCgodWludDMyX3QpKFBDUjNfUkVHU19FQzIpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IzX0VDMl9QUzJfMl9CSVRQT1MgJiAweEZGdSkpLCAgICAJCglQQ1JfUFMyXzMJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfUFMyXzNfQklUUE9TICYgMHhGRnUpKSwgICAgCQoJUENSX1NQSTAJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfU1BJMF9CSVRQT1MgJiAweEZGdSkpLCAgICAgCQoJUENSX0hUSU1FUgkJCT0gKCgodWludDMyX3QpKFBDUjNfUkVHU19FQzIpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IzX0VDMl9IVElNRVJfQklUUE9TICYgMHhGRnUpKSwgICAgICAJCglQQ1JfS0VZU0NBTgkJCT0gKCgodWludDMyX3QpKFBDUjNfUkVHU19FQzIpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IzX0VDMl9LRVlTQ0FOX0JJVFBPUyAmIDB4RkZ1KSksICAgICAgCQoJUENSX1JQTV9QV00JCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfUlBNX1BXTV9CSVRQT1MgJiAweEZGdSkpLCAgICAgIAkKCVBDUl9TTUIxCQkJPSAoKCh1aW50MzJfdCkoUENSM19SRUdTX0VDMikgPDwgOCkgKyAodWludDMyX3QpKFBDUjNfRUMyX1NNQjFfQklUUE9TICYgMHhGRnUpKSwgICAgIAkKCVBDUl9TTUIyCQkJPSAoKCh1aW50MzJfdCkoUENSM19SRUdTX0VDMikgPDwgOCkgKyAodWludDMyX3QpKFBDUjNfRUMyX1NNQjJfQklUUE9TICYgMHhGRnUpKSwgICAgCQoJUENSX1NNQjMJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfU01CM19CSVRQT1MgJiAweEZGdSkpLCAgICAgCQoJUENSX0xFRDAJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfTEVEMF9CSVRQT1MgJiAweEZGdSkpLCAgICAgCQoJUENSX0xFRDEJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfTEVEMV9CSVRQT1MgJiAweEZGdSkpLCAgICAgCQoJUENSX0xFRDIJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfTEVEMl9CSVRQT1MgJiAweEZGdSkpLCAgICAgCQoJUENSX0JDTQkJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfQkNNX0JJVFBPUyAmIDB4RkZ1KSksICAgCglQQ1JfU1BJMQkJCT0gKCgodWludDMyX3QpKFBDUjNfUkVHU19FQzIpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IzX0VDMl9TUEkxX0JJVFBPUyAmIDB4RkZ1KSksICAgICAJCglQQ1JfQlRJTUVSMgkJCT0gKCgodWludDMyX3QpKFBDUjNfUkVHU19FQzIpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IzX0VDMl9CVElNRVIyX0JJVFBPUyAmIDB4RkZ1KSksICAgCQoJUENSX0JUSU1FUjMJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfQlRJTUVSM19CSVRQT1MgJiAweEZGdSkpLCAgIAkKCVBDUl9CVElNRVI0CQkJPSAoKCh1aW50MzJfdCkoUENSM19SRUdTX0VDMikgPDwgOCkgKyAodWludDMyX3QpKFBDUjNfRUMyX0JUSU1FUjRfQklUUE9TICYgMHhGRnUpKSwgICAJCglQQ1JfQlRJTUVSNQkJCT0gKCgodWludDMyX3QpKFBDUjNfUkVHU19FQzIpIDw8IDgpICsgKHVpbnQzMl90KShQQ1IzX0VDMl9CVElNRVI1X0JJVFBPUyAmIDB4RkZ1KSksICAgCQoJUENSX0xFRDMJCQk9ICgoKHVpbnQzMl90KShQQ1IzX1JFR1NfRUMyKSA8PCA4KSArICh1aW50MzJfdCkoUENSM19FQzJfTEVEM19CSVRQT1MgJiAweEZGdSkpLAkKfSBQQ1JfQkxLX0lEOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiAgUENSIFByb2Nlc3NvciBDbEsgRGl2aWRlIFZhbHVlcyAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmVudW0gUFJPQ0VTU09SX0NMS19ESVZJREVfVkFMVUUKewoJUENSX0NQVV9DTEtfRElWSURFXzEgPSAxLAoJUENSX0NQVV9DTEtfRElWSURFXzQgPSA0LAoJUENSX0NQVV9DTEtfRElWSURFXzE2ID0gMTYsCglQQ1JfQ1BVX0NMS19ESVZJREVfNDggPSA0OAkKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiAgU3lzdGVtIFNsZWVwIE1vZGVzIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZW51bSBTWVNURU1fU0xFRVBfTU9ERVMKewoJU1lTVEVNX0hFQVZZX1NMRUVQXzEgPSAwLAkKCVNZU1RFTV9IRUFWWV9TTEVFUF8zID0gMSwKCVNZU1RFTV9IRUFWWV9TTEVFUF8yID0gMiwKCVNZU1RFTV9ERUVQRVNUX1NMRUVQID0gNQkKfTsKCi8qIEJpdG1hc2sgZm9yIFN5c3RlbSBTbGVlcCBDb250cm9sIFJlZ2lzdGVyICovCiNkZWZpbmUgUENSX1NZU19TTFBfQ1RSTF9SSU5HX09TQ19QV1JfRE9XTl9CSVRNQVNLCQkJKDFVTDw8MCkKI2RlZmluZSBQQ1JfU1lTX1NMUF9DVFJMX1JJTkdfT1NDX09VVFBVVF9HQVRFX0JJVE1BU0sJCSgxVUw8PDEpCiNkZWZpbmUgUENSX1NZU19TTFBfQ1RSTF9DT1JFX1JFR0xUT1JfU1REQllfQklUTUFTSwkJCSgxVUw8PDIpCgovKiBCaXRtYXNrIGZvciBDaGlwIFN1Yi1zeXN0ZW0gUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyICovCiNkZWZpbmUgUENSX0NISVBfU1VCU1lTVEVNX1ZDQ19SRVNFVF9TVFNfQklUTUFTSwkJCSgxVUw8PDIpCiNkZWZpbmUgUENSX0NISVBfU1VCU1lTVEVNX1NJT19SRVNFVF9TVFNfQklUTUFTSwkJCSgxVUw8PDMpCiNkZWZpbmUgUENSX0NISVBfU1VCU1lTVEVNX1ZCQVRfUkVTRVRfU1RTX0JJVE1BU0sJCQkoMVVMPDw1KQojZGVmaW5lIFBDUl9DSElQX1NVQlNZU1RFTV9WQ0MxX1JFU0VUX1NUU19CSVRNQVNLCQkJKDFVTDw8NikKI2RlZmluZSBQQ1JfQ0hJUF9TVUJTWVNURU1fMzJLX0FDVElWRV9TVFNfQklUTUFTSwkJCSgxVUw8PDEwKQojZGVmaW5lIFBDUl9DSElQX1NVQlNZU1RFTV9QQ0lDTEtfQUNUSVZFX1NUU19CSVRNQVNLCQkoMVVMPDwxMSkKCi8qIEJpdG1hc2sgZm9yIFByb2Nlc3NvciBDbG9jayBDb250cm9sIFJlZ2lzdGVyICovCiNkZWZpbmUgUENSX09TQ0lMTEFUT1JfTE9DS19TVEFUVVNfQklUTUFTSwkJCQkJKDFVTDw8OCkKCi8qIEJpdG1hc2sgZm9yIFBvd2VyIFJlc2V0IENvbnRyb2wgUmVnaXN0ZXIgKi8KI2RlZmluZSBQQ1JfaVJFU0VUX09VVF9CSVRNQVNLCQkJCQkJCQkoMVVMPDwwKQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgQVBJIC0gRnVuY3Rpb25zIHRvIHByb2dyYW0gU2xlZXAgRW5hYmxlLCBDTEsgUmVxZCBTdGF0dXMsICAgICAgICAgICAgICoKICogIFJlc2V0IEVuYWJsZSBmb3IgYSBibG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qKiBTZXRzIG9yIENsZWFycyBibG9jayBzcGVjaWZpYyBiaXQgaW4gUENSIFNsZWVwIEVuYWJsZSBSZWdpc3RlcgogKiBAcGFyYW0gcGNyX2Jsb2NrX2lkIC0gcGNyIGJsb2NrIGlkIGVuY29kZWQgdXNpbmcgUENSeF9SRUdTX0JJVCAKICogQHBhcmFtIHNldF9jbHJfZmxhZyAtIEZsYWcgdG8gc2V0ICgxKSBvciBjbGVhciAoMCkgYml0IGluIHRoZSBQQ1IgU2xlZXAgRW5hYmxlIFJlZ2lzdGVyCiAqLwp2b2lkIHBjcl9zbGVlcF9lbmFibGUodWludDMyX3QgcGNyX2Jsb2NrX2lkLCB1aW50OF90IHNldF9jbHJfZmxhZyk7CgovKiogR2V0IENsb2NrIFJlcXVpcmVkIFN0YXR1cyBmb3IgdGhlIGJsb2NrCiAqIEBwYXJhbSBwY3JfYmxvY2tfaWQgLSBwY3IgYmxvY2sgaWQgZW5jb2RlZCB1c2luZyBQQ1J4X1JFR1NfQklUIAogKiBAcmV0dXJuIHVpbnQ4X3QgLSAxIGlmIENsb2NrIFJlcXVpcmVkIFN0YXR1cyBzZXQsIGVsc2UgMAogKi8KdWludDhfdCBwY3JfY2xvY2tfcmVxZF9zdGF0dXNfZ2V0KHVpbnQzMl90IHBjcl9ibG9ja19pZCk7CgovKiogU2V0cyBvciBDbGVhcnMgUmVzZXQgRW5hYmxlIHJlZ2lzdGVyIGJpdCBmb3IgdGhlIGJsb2NrCiAqIEBwYXJhbSBwY3JfYmxvY2tfaWQgLSBwY3IgYmxvY2sgaWQgZW5jb2RlZCB1c2luZyBQQ1J4X1JFR1NfQklUIAogKiBAcGFyYW0gc2V0X2Nscl9mbGFnIC0gRmxhZyB0byBzZXQgKDEpIG9yIGNsZWFyICgwKSBiaXQgaW4gdGhlIFBDUiBSZXNldCBFbmFibGUgUmVnaXN0ZXIKICovCnZvaWQgcGNyX3Jlc2V0X2VuYWJsZSh1aW50MzJfdCBwY3JfYmxvY2tfaWQsIHVpbnQ4X3Qgc2V0X2Nscl9mbGFnKTsKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogIEFQSSAtICAgRnVuY3Rpb25zIGZvciBlbnRlcmluZyBsb3cgcG93ZXIgbW9kZXMgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qKiBJbnN0cnVjdHMgYWxsIGJsb2NrcyB0byBzbGVlcCBieSBzZXR0aW5nIHRoZSBTbGVlcCBFbmFibGUgYml0cyAqLwp2b2lkIHBjcl9hbGxfYmxvY2tzX3NsZWVwKHZvaWQpOwoKLyoqIENsZWFycyB0aGUgU2xlZXAgRW5hYmxlIGJpdHMgZm9yIGFsbCBibG9ja3MgKi8Kdm9pZCBwY3JfYWxsX2Jsb2Nrc193YWtlKHZvaWQpOwoKLyoqIFByb2dyYW1zIHJlcXVpcmVkIHNsZWVwIG1vZGUgaW4gU3lzdGVtIFNsZWVwIENvbnRyb2wgUmVnaXN0ZXIKICogQHBhcmFtIHNsZWVwX21vZGUgLSBzZWUgZW51bSBTWVNURU1fU0xFRVBfTU9ERVMKICovCnZvaWQgcGNyX3N5c3RlbV9zbGVlcCh1aW50OF90IHNsZWVwX21vZGUpOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBQZXJpcGhlcmFsIEZ1bmN0aW9uIC0gRnVuY3Rpb25zIHRvIHByb2dyYW0gYW5kIHJlYWQgMzItYml0IHZhbHVlcyAgICAgICoKICogZnJvbSBQQ1IgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qKiBXcml0ZSAzMi1iaXQgdmFsdWUgaW4gdGhlIFBDUiBSZWdpc3RlcgogKiBAcGFyYW0gcGNyX3JlZ19pZCAtIHBjciByZWdpc3RlciBpZCAKICogQHBhcmFtIHZhbHVlIC0gMzItYml0IHZhbHVlCiAqLwp2b2lkIHBfcGNyX3JlZ193cml0ZSh1aW50OF90IHBjcl9yZWdfaWQsIHVpbnQzMl90IHZhbHVlKTsKCi8qKiBSZWFkcyAzMi1iaXQgdmFsdWUgZnJvbSB0aGUgUENSIFJlZ2lzdGVyCiAqIEBwYXJhbSBwY3JfcmVnX2lkIC0gcGNyIHJlZ2lzdGVyIGlkIAogKiBAcmV0dXJuIHZhbHVlIC0gMzItYml0IHZhbHVlCiAqLwp1aW50MzJfdCBwX3Bjcl9yZWdfcmVhZCh1aW50OF90IHBjcl9yZWdfaWQpOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBQZXJpcGhlcmFsIEZ1bmN0aW9uIC0gRnVuY3Rpb25zIHRvIHNldCwgY2xyIGFuZCBnZXQgYml0cyBpbiAgICAgICAgICAgICoKICogUENSIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIAogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiogU2V0cyBiaXRzIGluIGEgUENSIFJlZ2lzdGVyCiAqIEBwYXJhbSBwY3JfcmVnX2lkIC0gcGNyIHJlZ2lzdGVyIGlkIAogKiBAcGFyYW0gYml0X21hc2sgLSBCaXQgbWFzayBvZiBiaXRzIHRvIHNldCAKICovCnZvaWQgcF9wY3JfcmVnX3NldCh1aW50OF90IHBjcl9yZWdfaWQsIHVpbnQzMl90IGJpdF9tYXNrKTsKCi8qKiBDbGVhcnMgYml0cyBpbiBhIFBDUiBSZWdpc3RlcgogKiBAcGFyYW0gcGNyX3JlZ19pZCAtIHBjciByZWdpc3RlciBpZCAKICogQHBhcmFtIGJpdF9tYXNrIC0gQml0IG1hc2sgb2YgYml0cyB0byBjbGVhciAKICovCnZvaWQgcF9wY3JfcmVnX2Nscih1aW50OF90IHBjcl9yZWdfaWQsIHVpbnQzMl90IGJpdF9tYXNrKTsKCi8qKiBSZWFkIGJpdHMgaW4gYSBQQ1IgUmVnaXN0ZXIKICogQHBhcmFtIHBjcl9yZWdfaWQgLSBwY3IgcmVnaXN0ZXIgaWQgCiAqIEBwYXJhbSBiaXRfbWFzayAtIEJpdCBtYXNrIG9mIGJpdHMgdG8gcmVhZCAKICogQHJldHVybiB2YWx1ZSAtIDMyLWJpdCB2YWx1ZQogKi8KdWludDMyX3QgcF9wY3JfcmVnX2dldCh1aW50OF90IHBjcl9yZWdfaWQsIHVpbnQzMl90IGJpdF9tYXNrKTsKCi8qKiBTZXRzIG9yIENsZWFycyBiaXRzIGluIGEgUENSIFJlZ2lzdGVyIC0gSGVscGVyIEZ1bmN0aW9uCiAqIEBwYXJhbSBwY3JfcmVnX2lkIC0gcGNyIHJlZ2lzdGVyIGlkIAogKiBAcGFyYW0gYml0X21hc2sgLSBCaXQgbWFzayBvZiBiaXRzIHRvIHNldCBvciBjbGVhcgogKiBAcGFyYW0gc2V0X2Nscl9mbGFnIC0gRmxhZyB0byBzZXQgKDEpIG9yIGNsZWFyICgwKSBiaXRzIGluIHRoZSBQQ1IgUmVnaXN0ZXIKICovCnZvaWQgcF9wY3JfcmVnX3VwZGF0ZSh1aW50OF90IHBjcl9yZWdfaWQsIHVpbnQzMl90IGJpdF9tYXNrLCB1aW50OF90IHNldF9jbHJfZmxhZyk7CgkKLy9GdW5jdGlvbnMgdG8gb3BlcmF0ZSBvbiBTeXN0ZW0gU2xlZXAgQ29udHJvbCBSZWdpc3RlcgkKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogUGVyaXBoZXJhbCBGdW5jdGlvbiAtIEZ1bmN0aW9ucyB0byBvcGVyYXRlIG9uIFN5c3RlbSBTbGVlcCBDb250cm9sICAgICAqCiAqIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiogU2V0cy9DbGVhcnMgdGhlIFJpbmcgb3NjaWxsYXRvciBwb3dlciBkb3duIGJpdCAKICogICAgICAgICBpbiBTeXN0ZW0gU2xlZXAgQ29udHJvbCBSZWdpc3RlcgogKiBAcGFyYW0gc2V0X2Nscl9mbGFnIC0gMSAtIFNldHMgdGhlIGJpdCwgMCAtIGNsZWFycyB0aGUgYml0CiAqLwp2b2lkIHBfcGNyX3N5c3RlbV9zbGVlcF9jdHJsX3Jpbmdfb3NjX3Bvd2VyX2Rvd24odWludDhfdCBzZXRfY2xyX2ZsYWcpOwoKLyoqIFNldHMvQ2xlYXJzIHRoZSBSaW5nIG9zY2lsbGF0b3Igb3V0cHV0IGdhdGUgYml0IAogKiAgICAgICAgIGluIFN5c3RlbSBTbGVlcCBDb250cm9sIFJlZ2lzdGVyCiAqIEBwYXJhbSBzZXRfY2xyX2ZsYWcgLSAxIC0gU2V0cyB0aGUgYml0LCAwIC0gY2xlYXJzIHRoZSBiaXQKICovCnZvaWQgcF9wY3Jfc3lzdGVtX3NsZWVwX2N0cmxfcmluZ19vc2Nfb3V0cHV0X2dhdGUodWludDhfdCBzZXRfY2xyX2ZsYWcpOwoKLyoqIFNldHMvQ2xlYXJzIHRoZSBDb3JlIHJlZ3VsYXRvciBzdGFuZGJ5IGJpdCAKICogICAgICAgICBpbiBTeXN0ZW0gU2xlZXAgQ29udHJvbCBSZWdpc3RlcgogKiBAcGFyYW0gc2V0X2Nscl9mbGFnIC0gMSAtIFNldHMgdGhlIGJpdCwgMCAtIGNsZWFycyB0aGUgYml0CiAqLwp2b2lkIHBfcGNyX3N5c3RlbV9zbGVlcF9jdHJsX2NvcmVfcmVndWxhdG9yX3N0ZGJ5KHVpbnQ4X3Qgc2V0X2Nscl9mbGFnKTsKCi8qKiBXcml0ZXMgcmVxdWlyZWQgc2xlZXAgbW9kZSBpbiBTeXN0ZW0gU2xlZXAgQ29udHJvbCBSZWdpc3RlcgogKiBAcGFyYW0gc2xlZXBfdmFsdWUgLSBTeXN0ZW0gU2xlZXAgY29udHJvbCB2YWx1ZSAtIFtEMiwgRDEsIEQwXQogKi8Kdm9pZCBwX3Bjcl9zeXN0ZW1fc2xlZXBfY3RybF93cml0ZSh1aW50OF90IHNsZWVwX3ZhbHVlKTsKCi8qKiBSZWFkcyB0aGUgU3lzdGVtIFNsZWVwIENvbnRyb2wgUENSIFJlZ2lzdGVyCiAqIEByZXR1cm4gdmFsdWUgLSBieXRlIDAgb2YgdGhlIHN5c3RlbSBzbGVlcCBjb250cm9sIFBDUiByZWdpc3RlcgogKi8KdWludDhfdCBwX3Bjcl9zeXN0ZW1fc2xlZXBfY3RybF9yZWFkKHZvaWQpOwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiBQZXJpcGhlcmFsIEZ1bmN0aW9uIC0gRnVuY3Rpb24gdG8gcHJvZ3JhbSB0byBDTEsgRGl2aWRlIFZhbHVlICAgICAgICAgICogCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qKiBXcml0ZXMgdGhlIGNsb2NrIGRpdmlkZSB2YWx1ZSBpbiB0aGUgUHJvY2Vzc29yIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIKICogQHBhcmFtIGNsa19kaXZpZGVfdmFsdWUgLSBjbGsgZGl2aWRlIHZhbHVlcywgdmFsaWQgdmFsdWVzIGluIGVudW0gUFJPQ0VTU09SX0NMS19ESVZJREVfVkFMVUUKICovCnZvaWQgcF9wY3JfcHJvY2Vzc29yX2Nsa19jdHJsX3dyaXRlKHVpbnQ4X3QgY2xrX2RpdmlkZV92YWx1ZSk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIFBlcmlwaGVyYWwgRnVuY3Rpb24gLSBGdW5jdGlvbiB0byBwcm9ncmFtIHRoZSBTbG93IENsb2NrIENvbnRyb2wgICAgICAgKgogKiBSZWdpc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoqIFdyaXRlIHRoZSBzbG93IGNsb2NrIGRpdmlkZSB2YWx1ZSBpbiB0aGUgU2xvdyBDbG9jayBDb250cm9sIFJlZ2lzdGVyCiAqIEBwYXJhbSBzbG93X2Nsa19kaXZpZGVfdmFsdWUgLSBzbG93IGNsayBkaXZpZGUgdmFsdWUKICovCnZvaWQgcF9wY3Jfc2xvd19jbGtfY3RybF93cml0ZSh1aW50OF90IHNsb3dfY2xrX2RpdmlkZV92YWx1ZSk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIFBlcmlwaGVyYWwgRnVuY3Rpb24gLSBGdW5jdGlvbiB0byByZWFkIHRoZSBPc2NpbGxhdG9yIExvY2sgU3RhdHVzICAgICAgKi8gCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyoqIFJlYWRzIHRoZSBPc2NpbGxhdG9yIExvY2sgc3RhdHVzIGJpdCBpbiB0aGUgT3NjaWxsYXRvciBJRCBSZWdpc3RlcgogKiBAcmV0dXJuIDEgaWYgT3NjaWxsYXRvciBMb2NrIFN0YXR1cyBiaXQgaXMgc2V0LCBlbHNlIDAKICovCnVpbnQ4X3QgcF9wY3Jfb3NjaWxsYXRvcl9sb2NrX3N0c19nZXQodm9pZCk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIFBlcmlwaGVyYWwgRnVuY3Rpb24gLSBGdW5jdGlvbnMgdG8gcmVhZCB2YXJpb3VzIHBvd2VyIHN0YXR1cyBpbiAgICAgICAgKgogKiBDaGlwIFN1Yi1TeXN0ZW0gcmVnaXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoqIFJlYWRzIHRoZSBWQ0MgUmVzZXQgU3RhdHVzIGJpdCAKICogICAgICAgIGluIHRoZSBDaGlwIFN1YnN5c3RlbSBQb3dlciBSZXNldCBTdGF0dXMgUmVnaXN0ZXIKICogQHJldHVybiAxIGlmIFZDQyBSZXNldCBTdGF0dXMgYml0IGlzIHNldCwgZWxzZSAwCiAqLwp1aW50OF90IHBfcGNyX2NoaXBfc3Vic3lzdGVtX3ZjY19yZXNldF9zdHNfZ2V0KHZvaWQpOwoKLyoqIFJlYWRzIHRoZSBTSU8gUmVzZXQgU3RhdHVzIGJpdCAKICogICAgICAgIGluIHRoZSBDaGlwIFN1YnN5c3RlbSBQb3dlciBSZXNldCBTdGF0dXMgUmVnaXN0ZXIKICogQHJldHVybiAxIGlmIFNJTyBSZXNldCBTdGF0dXMgYml0IGlzIHNldCwgZWxzZSAwCiAqLwp1aW50OF90IHBfcGNyX2NoaXBfc3Vic3lzdGVtX3Npb19yZXNldF9zdHNfZ2V0KHZvaWQpOwoKLyoqIFJlYWRzIHRoZSBWQkFUIFJlc2V0IFN0YXR1cyBiaXQgCiAqICAgICAgICBpbiB0aGUgQ2hpcCBTdWJzeXN0ZW0gUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyCiAqIEByZXR1cm4gMSBpZiBWQkFUIFJlc2V0IFN0YXR1cyBiaXQgaXMgc2V0LCBlbHNlIDAKICovCnVpbnQ4X3QgcF9wY3JfY2hpcF9zdWJzeXN0ZW1fdmJhdF9yZXNldF9zdHNfZ2V0KHZvaWQpOwoKLyoqIENsZWFycyB0aGUgVkJBVCBSZXNldCBTdGF0dXMgYml0IAogKiAgICAgICAgaW4gdGhlIENoaXAgU3Vic3lzdGVtIFBvd2VyIFJlc2V0IFN0YXR1cyBSZWdpc3RlciAKICovCnZvaWQgcF9wY3JfY2hpcF9zdWJzeXN0ZW1fdmJhdF9yZXNldF9zdHNfY2xyKHZvaWQpOwoKLyoqIFJlYWRzIHRoZSBWQ0MxIFJlc2V0IFN0YXR1cyBiaXQgCiAqICAgICAgICBpbiB0aGUgQ2hpcCBTdWJzeXN0ZW0gUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyCiAqIEByZXR1cm4gMSBpZiBWQ0MxIFJlc2V0IFN0YXR1cyBiaXQgaXMgc2V0LCBlbHNlIDAKICovCnVpbnQ4X3QgcF9wY3JfY2hpcF9zdWJzeXN0ZW1fdmNjMV9yZXNldF9zdHNfZ2V0KHZvaWQpOwoKLyoqIENsZWFycyB0aGUgVkNDMSBSZXNldCBTdGF0dXMgYml0IAogKiAgICAgICAgaW4gdGhlIENoaXAgU3Vic3lzdGVtIFBvd2VyIFJlc2V0IFN0YXR1cyBSZWdpc3RlciAKICovCnZvaWQgcF9wY3JfY2hpcF9zdWJzeXN0ZW1fdmNjMV9yZXNldF9zdHNfY2xyKHZvaWQpOwoKLyoqIFJlYWRzIHRoZSAzMktfQUNUSVZFIHN0YXR1cyBiaXQgCiAqICAgICAgICBpbiB0aGUgQ2hpcCBTdWJzeXN0ZW0gUG93ZXIgUmVzZXQgU3RhdHVzIFJlZ2lzdGVyCiAqIEByZXR1cm4gMSBpZiAzMl9BQ1RJVkUgYml0IGlzIHNldCwgZWxzZSAwCiAqLwp1aW50OF90IHBfcGNyX2NoaXBfc3Vic3lzdGVtXzMyS19hY3RpdmVfc3RzX2dldCh2b2lkKTsKCi8qKiBSZWFkcyB0aGUgUENJQ0xLX0FDVElWRSBzdGF0dXMgYml0IAogKiAgICAgICAgaW4gdGhlIENoaXAgU3Vic3lzdGVtIFBvd2VyIFJlc2V0IFN0YXR1cyBSZWdpc3RlcgogKiBAcmV0dXJuIDEgaWYgQ0lDTEtfQUNUSVZFIGJpdCBpcyBzZXQsIGVsc2UgMAogKi8KdWludDhfdCBwX3Bjcl9jaGlwX3N1YnN5c3RlbV9wY2ljbGtfYWN0aXZlX3N0c19nZXQodm9pZCk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qIFBlcmlwaGVyYWwgRnVuY3Rpb24gLSBGdW5jdGlvbnMgZm9yIFBvd2VyIFJlc2V0IENvbnRyb2wgUmVnaXN0ZXIgICAgICAgKi8gCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyoqIFJlYWRzIHRoZSBpUkVTRVRfT1VUIGJpdCBpbiB0aGUgUG93ZXIgUmVzZXQgQ29udHJvbCBSZWdpc3RlcgogKiBAcmV0dXJuIDEgaWYgaVJFU0VUX09VVCBiaXQgaXMgc2V0LCBlbHNlIDAKICovCnVpbnQ4X3QgcF9wY3JfaVJlc2V0X091dF9nZXQodm9pZCk7CgovKiogU2V0cy9DbGVhcnMgdGhlIGlSRVNFVF9PVVQgYml0IGluIHRoZSBQb3dlciBSZXNldCBDb250cm9sIFJlZ2lzdGVyCiAqIEBwYXJhbSAxIFNldCBpUkVTRVRfT1VUIGJpdDsgMCAtIENsZWFyIHRoZSBiaXQKICovCnZvaWQgcF9wY3JfaVJlc2V0X091dCh1aW50OF90IHNldF9jbHJfZmxhZyk7CgojZW5kaWYgLy8gI2lmbmRlZiBfUENSX0gKLyogZW5kIHBjci5oICovCi8qKiAgIEB9CiAqLwoKCgo=